有没有办法检查传递给 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)
并且 usingReceivedWithAnyArgs
将导致 Arg.Is() 被忽略,创建一个无论b的值如何都通过的测试。
最后,我尝试安排假货来捕捉价值:
fake.method(b: Arg.Do<int>(i => captureValue = i));
但除非签名完全匹配,否则不会命中。我正在寻找一种方法来测试单个值,而无需在将可选参数添加到方法时重写大量测试。
注意:此示例使用int
值,但引用类型也会出现同样的问题。
并给维护者一个注释:如果这是一个可行的修改,我希望 Arg.Is 覆盖 ReceivedWithAnyArgs。这将允许创建最少指定的测试。