【问题标题】:NSubstitute checking complex arguments inside a Received() checkNSubstitute 检查 Received() 检查中的复杂参数
【发布时间】:2018-02-16 14:47:46
【问题描述】:

看着here,我被引导相信我正在尝试做的事情是可能的。但是,当我认为它应该通过时,我似乎得到了一个失败的测试。

这是我的测试代码:

// Arrange
dbOperations = Substitute.For<IDbOperations>();
myClass = new MyClass(dbOperations);

string test = "test string";

// Act
myClass.MyMethod(arg1, arg2, test);

// Assert            
dbOperations.Received(2).TestMethod(Arg.Is<MyClass2>(a => a.MyString == test));

我已经跟踪了MyMethod,它使用MyClass2 的实例调用dbOperations 两次,其中MyString 属性设置为“测试字符串”。我是否误读了此处的文档 - 这种检查是否可能使用 NSubtitute,如果是,我做错了什么?

【问题讨论】:

标签: c# unit-testing xunit nsubstitute


【解决方案1】:

这是一个按预期工作的示例(使用 NSub 3.1.0):

using Xunit;
using NSubstitute;
using System;

public interface IDbOperations {
    void TestMethod(MyClass2 myClass2);
}

public class MyClass2 {
    public String MyString { get; set; }
}

public class MyClass {
    private IDbOperations Ops { get; }

    public MyClass(IDbOperations ops) { Ops = ops; }

    public void MyMethod(object arg1, object arg2, string test) {
        Ops.TestMethod(new MyClass2 { MyString = test });
        Ops.TestMethod(new MyClass2 { MyString = test });
    }
}

public class UnitTest1 {

    [Fact]
    public void StackOverflowQuestion() {
        // Arrange
        var arg1 = "1";
        var arg2 = "2";
        var dbOperations = Substitute.For<IDbOperations>();
        var myClass = new MyClass(dbOperations);

        string test = "test string";

        // Act
        myClass.MyMethod(arg1, arg2, test);

        // Assert            
        dbOperations.Received(2).TestMethod(Arg.Is<MyClass2>(a => a.MyString == test));
    }
}

我发现在这种情况下创建一个新的、简化版本的我正在尝试做的事情并查看它是否有效(如上面的那个)很有用,然后花一些时间看看我的实际代码有何不同从简化的。这应该有望突出问题所在。

【讨论】:

  • 谢谢。奇怪的事情:我尝试了你的示例项目,它有效;然后我切换回我的项目以尝试确定差异。令人讨厌的是,在没有任何更改(除了时间的流逝以及我的机器关闭和重新启动之外)之后,它就可以工作了。因此,我假设测试实际上通过了,而 VS 错误地报告了失败。
  • @pm_2,啊,这类问题真令人沮丧。很高兴你把事情解决了。 :)
【解决方案2】:

比较字符串时,尝试使用 Equals 方法而不是 ==。 how-to-compare-strings

【讨论】:

  • 还要检查你的方法为什么会收到 2 个调用。也许一个调用得到正确的参数,而另一个没有。
  • 肯定有两个调用,字符串完全一样。
  • 贴出单元测试库显示的消息
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多