1

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

使用几个可选参数对方法进行映像:

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

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

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

并且不管ab是否通过,都要进行验证调用。

这有效:

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)

并且 usingReceivedWithAnyArgs将导致 Arg.Is() 被忽略,创建一个无论b的值如何都通过的测试。

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

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

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

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

并给维护者一个注释:如果这是一个可行的修改,我希望 Arg.Is 覆盖 ReceivedWithAnyArgs。这将允许创建最少指定的测试。

4

0 回答 0