如何模拟AppDomain.CurrentDomain.BaseDirectory

问题描述 投票:0回答:1

我有服务类的单元测试,我想为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.
c# asp.net-mvc visual-studio unit-testing nunit
1个回答
0
投票

你可能不想改变你的课程,但这正是你应该做的。如果您想进行一些正确的测试,您需要确保代码实际上是可测试的。

有一个简单的解决方案,不需要进行大量更改,只需向构造函数或实际要测试的方法添加新参数,并将实际路径传递给它。

您的代码可能如下所示:

public SomeClass 
{
   public SomeClass(string baseLocation)
}

然后当你实例化它时,你可以简单地做一些事情

var basePath = AppDomain.CurrentDomain.BaseDirectory;

var someClass = new SomeClass(basePath);

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

这种方法的另一个好处是你不需要担心嘲笑任何东西,你的测试代码变得非常简单和实际可维护

© www.soinside.com 2019 - 2024. All rights reserved.