避免在单元测试中调用非虚方法

时间:2018-02-01 06:56:00

标签: c# unit-testing

我的任务是为我们的一个代码库编写一些测试。 现在我有了这堂课:

```

public class A 
{
  public void method_1() 
  { 
    this.method_2();
    // Do something
  }

  public void method_2() 
  {
     Environment.CurrentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
     // Do something
  }
}

```

现在我正在尝试为method_1编写测试而不调用method_2并获取NullReferenceException

[TestClass]
public class MyTestClass
{

  [TestMethod]
  public void MyTestMethod()
  {
    // Ignore the call: Assembly.GetEntryAssembly() because it returns null>

    new A().method_1();
  } 

有什么建议吗?

修改: 我不允许更改代码。

2 个答案:

答案 0 :(得分:2)

如果没有覆盖/模仿method_2内部逻辑的可能性,那么你无能为力 如果它是您自己的代码库,我建议将调用Assembly.GetEntryAssembly().Location移动到一些帮助方法,您可以覆盖它们进行测试。

答案 1 :(得分:1)

假设您无法更改代码,可以使用MS Fakes模拟DateTime.Now等静态方法。也应该在Assembly.GetEntryAssembly()。

上工作

我不是MS Fakes的忠实粉丝,但过去有太多问题。如果您可以对代码进行少量更改,则可以将method_2设置为虚拟并执行以下操作:

public class MyTestA : A 
{
  public override void method_2() 
  {
    //Do nothing
  }
}

然后,您可以针对MyTestA编写测试。

当然,将方法2中的代码放在新的类/接口中并将其模拟为虚拟接口是一种更清晰的解决方案。