NSubstitute 检查 Received() 检查中的复杂参数

NSubstitute checking complex arguments inside a Received() check

看着 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 属性 设置为 "test string"。我是不是误读了这里的文档 - 这种检查甚至可能使用 NSubtitute,如果是这样,我做错了什么?

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

这是一个按预期工作的示例(使用 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 WhosebugQuestion() {
        // 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));
    }
}

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