微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NSubstitute 在执行 .received().functionName() 检查时实际上调用了该函数?

如何解决NSubstitute 在执行 .received().functionName() 检查时实际上调用了该函数?

我不确定这是否是因为我的 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 以了解何时调用函数(因为它不可能使用断点调试它,因为它很少失败)。

我观察到的是,当测试成功时,它会打印以下内容

内部模拟函数

函数A调用完成

函数 B 接收检查完成

但是当它失败时,它会打印以下内容

内部模拟函数

函数A调用完成

内部模拟函数

然后是异常堆栈跟踪。所以不知何故,当我在做 Received(2).FunctionB() 时,而不是检查接收它实际上是在做一个函数调用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。