NSubstitute:使用数组参数检查接收的方法

时间:2012-10-02 22:05:26

标签: c# nsubstitute

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

假设界面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[]*)

所以这看起来像是使用foos以外的某个数组调用ProcessSomething,对吗?

好吧,如果我改为测试它,我使用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中的错误,还是我使用错了?

1 个答案:

答案 0 :(得分:51)

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