我有服务类的单元测试,我想为AppDomain.CurrentDomain.BaseDirectory
模拟var someCLass = new SomeClass()
而不改变这个类。
在此类中,它用作生成用于读取文件的新路径的路径。但如果测试运行,AppDomain.CurrentDomain.BaseDirectory
将更改为不同的目录。
我不想使用typemock Isolate,但它看起来像一个可能的修复,我想找到不同的方法来解决这个可能与Moq
。
public SomeClass
{
SomeClass()
{
//Use something like that
var path = AppDomain.CurrentDomain.BaseDirectory;
}
}
//Test Class
[TestFixture]
public class TestClass
{
private SomeClass someClass;
[Test]
public void SomeTest()
{
someClass = new SomeClass();
}
}
//Change AppDomain.CurrentDomain.BaseDirectory for unit test without changing original class.
你可能不想改变你的课程,但这正是你应该做的。如果您想进行一些正确的测试,您需要确保代码实际上是可测试的。
有一个简单的解决方案,不需要进行大量更改,只需向构造函数或实际要测试的方法添加新参数,并将实际路径传递给它。
您的代码可能如下所示:
public SomeClass
{
public SomeClass(string baseLocation)
}
然后当你实例化它时,你可以简单地做一些事情
var basePath = AppDomain.CurrentDomain.BaseDirectory;
var someClass = new SomeClass(basePath);
现在,您可以从任何地方注入路径,包括测试。如果您需要可测试代码,则需要删除此类依赖项。 DateTime.Now是另一个可以这种方式注入的例子。
这种方法的另一个好处是你不需要担心嘲笑任何东西,你的测试代码变得非常简单和实际可维护