如何模拟AppDomain.CurrentDomain.BaseDirectory

时间:2019-04-18 14:18:00

标签: c# asp.net-mvc visual-studio unit-testing nunit

我对服务类进行了单元测试,我想为AppDomain.CurrentDomain.BaseDirectory模拟var someCLass = new SomeClass(),而无需更改此类。

在此类中,它用作生成用于读取文件的新路径的路径。但是,如果正在运行测试,AppDomain.CurrentDomain.BaseDirectory将更改为其他目录。

我不想使用typemock隔离,但它似乎是一种可能的解决方法,我想找到其他方法来解决这个问题,也许可以使用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.

1 个答案:

答案 0 :(得分:0)

您可能不想更改班级,但这正是您应该做的。 如果要进行一些适当的测试,则需要确保该代码从一开始就可以进行测试。

有一个简单的解决方案,不需要很多更改,只需向构造函数或您实际要测试的方法中添加一个新参数,然后将实际路径传递给它即可。

您的代码可能如下所示:

public SomeClass 
{
   public SomeClass(string baseLocation)
}

然后实例化它时,您只需执行类似的操作

var basePath = AppDomain.CurrentDomain.BaseDirectory;

var someClass = new SomeClass(basePath);

现在,您可以从任何位置插入包含测试的路径。如果您需要可测试的代码,则需要删除此类依赖项。 DateTime.Now是可以通过这种方式注入的另一个示例。

此方法的另一个好处是,您无需担心模拟任何事情,并且测试代码变得非常简单并且可以维护

相关问题