问题描述
我不确定这是否是因为我的 NSubstitute 代码或我的产品代码中的问题,但有时我的测试会失败并抛出我实际上打算捕获的异常。我会在下面写一小段代码来代表我在做什么。
// test code for function A in class A
public void Test_FunctionA_CatchesException(){
IClassB classb = Substitute.For<IClassB>();
classb.FunctionB().Returns(x => { return 5; },x => { Console.WriteLine("inside mock function"); throw new Exception("exception message"); });
ClassA classa = new ClassA(classb);
classa.FunctionA();
Console.WriteLine("Function A call complete");
classb.Received(2).FunctionB();
Console.WriteLine("function B received check complete");
}
// product code Class A
public class ClassA {
public void FunctionA() {
try {
int x = classb.FunctionB();
classb.FunctionB();
} catch (Exception) {
}
}
}
就是这样。我抛出异常的方式有问题吗?函数 B 是一个返回 int 的普通函数。这个单元测试虽然大部分工作正常,但一次抛出异常(我在 FunctionB 调用中抛出的异常)。遗憾的是,我也无法重现这种行为。
更新:
我能够重现该错误。我使用 NCrunch 运行这个测试直到失败。通过一些控制台日志记录,我能够缩小问题的范围。 (我也更新了上面的代码)。在替代的 FunctionB() 调用中,我添加了 Console.WriteLine 以了解何时调用此函数(因为它不可能使用断点调试它,因为它很少失败)。
我观察到的是,当测试成功时,它会打印以下内容:
内部模拟函数
函数 B 接收检查完成
但是当它失败时,它会打印以下内容:
内部模拟函数
内部模拟函数
然后是异常堆栈跟踪。所以不知何故,当我在做 Received(2).FunctionB() 时,而不是检查接收它实际上是在做一个函数调用。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)