NSubstitute无法确定要使用的参数规范

Dre*_*rew 4 c# mocking nsubstitute

我使用NUnit和NSubstitute进行单元测试.我有以下内容:

public interface IDataProvider
{
    void Log(int tvmId, DateTime time, int source, int level, int eventCode, string message);
}

...

var fakeDataProvider = Substitute.For<IDataProvider>();
...
fakeDataProvider.Received().Log(
    Arg.Any<int>(),
    new DateTime(2000, 1, 1),
    0,
    0,
    0,
    null);
Run Code Online (Sandbox Code Playgroud)

fakeDataProvider.Received()抛出AmbiguousArgumentException,并显示无法确定要使用的参数规范的消息.我在SO上找到了以下内容

无法确定要使用的参数规范

这是相关的,但我不能在上面的代码中应用它.为什么上面的代码含糊不清?我怎么能指定Received()它应该接受任何参数?

Mar*_*ldi 10

由于方法中有多个int参数,因此Log必须为每个参数使用参数规范.

fakeDataProvider.Received().Log(
    Arg.Any<int>(),
    new DateTime(2000, 1, 1),
    Arg.Is(0),
    Arg.Is(0),
    Arg.Is(0),
    null);
Run Code Online (Sandbox Code Playgroud)

  • 参数规范的工作原理是创建一个列表,其中包含所有规范的调用顺序,然后它通过调用的类型和顺序推断哪个规范与哪个参数相关。如果您有两个相同类型的参数,但只有一个使用了规范,则您无法确定要为哪一个使用规范。它没有关于它被用于哪个参数的信息。也许例外的措辞可以更好,但这是不可避免的。顺便说一句,你应该能够只使用 `null` 而不是 `Arg.Is&lt;string&gt;((string)null)`。 (2认同)