【问题标题】:NSubstitute: Checking received methods with array argumentsNSubstitute:使用数组参数检查接收到的方法
【发布时间】:2012-10-02 22:05:26
【问题描述】:

我想验证我的 NSubstitute 模拟上的方法是否使用特定的数组参数调用。

说接口IProcessor有一个方法void ProcessSomething(Foo[] something])。假设我的测试类名为Commander。我这样设置我的测试:

//prepare
var processor = Substitute.For<IProcessor>;
var commander = new Commander(processor);
var foo1 = new Foo("alpha");
var foo2 = new Foo("bravo");
var foos = new [] {foo1, foo2};

//act
commander.DoSomething(foo1, foo2);

//verify
processor.Received().ProcessSomething(foos);  // FAILS

Received() 调用失败:

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
    ProcessSomething(Foo[])
Actually received no matching calls.
Received 1 non-matching call (non-matching arguments indicated with '*' characters):
    ProcessSomething(*Foo[]*)

所以看起来 ProcessSomething 是用 foos 以外的某个数组调用的,对吧?

好吧,如果我改为测试这个,我使用Arg.Do() 捕获参数值,它会成功:

//prepare
//... as before
var actualFoos = null;

processor.ProcessSomething(Arg.Do<Foo[]>(x => actualFoos = x));

//act
commander.DoSomething(foo1, foo2);

//verify
Assert.That(actualFoos, Is.EqualTo(foos));   // SUCCEEDS

因此捕获参数并比较它是否相等(在此示例中使用 NUnit)是可行的,但验证接收到的调用失败。

这是 NSubstitute 中的错误,还是我用错了?

【问题讨论】:

    标签: c# nsubstitute


    【解决方案1】:

    我假设您的 Commander 对象将接受参数并将它们放入一个数组中,然后它会使用该数组来调用 Processor 模拟。

    您的foos 变量是您在设置中创建的另一个数组。即使它们具有相同的元素,数组也不会相互比较。所以 NSubstitute 会抱怨它没有收到预期的值(它收到了另一个恰好包含相同元素的数组)。

    编辑:试试这个版本:

    //prepare
    var processor = Substitute.For<IProcessor>;
    var commander = new Commander(processor);
    var foo1 = new Foo("alpha");
    var foo2 = new Foo("bravo");
    var foos = new [] {foo1, foo2};
    
    //act
    commander.DoSomething(foo1, foo2);
    
    //verify
    processor.Received().ProcessSomething(Arg.Is<Foo[]>(foos2 => foos.SequenceEqual(foos2));
    

    这需要导入 System.Linq 命名空间

    【讨论】:

    • 阅读您的答案后,我查看了 NUnit 源代码,发现 Is.EqualTo(通过 EqualConstraint)通过比较集合中的项目来检查集合是否相等。这就是为什么捕获价值并进行检查的原因。现在的问题是,为什么 .Net 集合不实现 Equals,但这是另一天的问题。
    • 这是一个可爱的语法。比 RhinoMocks 干净得多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多