使用NSubstitute检查单个可选参数

时间:2014-01-23 00:47:50

标签: c# unit-testing nsubstitute

有没有办法检查传递给NSubstitute假的单个值,而不必指定其他值?

使用多个可选参数绘制一个方法:

void myMethod(int a=0, int b=0, int c=0);

我希望能够确认将特定值传递给其中一个参数,而不必指定其他参数:

fake.Received().myMethod(b: Arg.Is(1));

并且无论是 a 还是 b ,都会进行此验证调用。

这有效:

fake.Received().myMethod(a: Arg.Any<int>(), b: Arg.Is(1), c: Arg.Any<int>())

但不是很易读,因为不相关的参数会使测试变得混乱,如果将另一个参数添加到method,它将会中断。

但是,这将忽略不将默认值传递给可选参数的方法调用:

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
myMethod(0, 1, 0)
Actually received no matching calls.
Received 1 non-matching call (non-matching arguments indicated with '*' characters):
myMethod(*2*, 1, 0)

使用ReceivedWithAnyArgs将导致忽略Arg.Is(),无论 b 的值如何,都会创建一个测试。

最后,我尝试安排假冒来捕捉价值:

fake.method(b: Arg.Do<int>(i => captureValue = i));

但除非签名完全匹配,否则不会被击中。我正在寻找一种方法来测试单个值,而无需在将可选参数添加到方法时重写大量测试。

注意:此示例使用int值,但引用类型也会出现同样的问题。

给维护者一个注意事项:我希望Arg.Is覆盖ReceivedWithAnyArgs,如果那是可行的修改。这将允许创建最低限度的指定测试。

0 个答案:

没有答案