48

我想验证我的 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 中的错误,还是我用错了?

4

1 回答 1

72

我假设您的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命名空间

于 2012-10-02T22:16:24.400 回答