我的任务是为我们的一个代码库编写一些测试。 现在我有了这堂课:
```
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();
}
有什么建议吗?
修改: 我不允许更改代码。
答案 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中的代码放在新的类/接口中并将其模拟为虚拟接口是一种更清晰的解决方案。