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

时间:2018-02-16 14:47:46

标签: c# unit-testing xunit nsubstitute

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属性设置为&#34; test string&#34;。我是否误读了这里的文档 - 甚至可能是NSubtitute的这种检查,如果是这样,我做错了什么?

2 个答案:

答案 0 :(得分: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));
    }
}

我觉得在这样的情况下创建我正在尝试做的新的简化版本并查看它是否有效(如上所述),然后花一些时间查看我的实际代码是如何不同的从简化的。这应该有希望突出问题所在。

答案 1 :(得分:-1)

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