NSubstitute 是否允许在同一方法上进行多种安排?

Are multiple arrangements allowed on the same method with NSubstitute?

我是 NSubstitute 的新手。测试失败是因为第二种安排导致调用第一种安排并使其甚至在 "act" 之前就失败了。我不确定我是否应该在同一方法上进行多次安排。但是我觉得无论如何都不应该调用第一个排列,因为参数不匹配。

public interface IMediator
{
    Task<TResponse> Send<TResponse>(IRequest<TResponse> request, CancellationToken cancellationToken = default(CancellationToken));

    Task Send(IRequest request, CancellationToken cancellationToken = default(CancellationToken));

    Task Publish<TNotification>(TNotification notification, CancellationToken cancellationToken = default(CancellationToken))
        where TNotification : INotification;
}

public class MyMessage : IRequest<MyResponse> {}

public class MyResponse {}

public class MyMessage2 : IRequest<MyResponse> {}

    [Fact]
    public async Task Mock_Fail() {
        var mediatr = Substitute.For<IMediator>();
        var myMessage = new MyMessage();
        var myMessage2 = new MyMessage();
        var myResponse = new MyResponse();
        var myResponse2 = new MyResponse();

        mediatr.Send(Arg.Any<MyMessage>())
            .Returns((ci) => {
                Assert.Same(myMessage, ci[0]); //That fails
                return myResponse;
            });

        mediatr.Send(Arg.Any<MyMessage2>())
            .Returns((ci) => {
                return myResponse2;
            });

       //Execution never reaches here
        var response = await mediatr.Send(myMessage);
        var response2 = await mediatr.Send(myMessage2);

    }

通常我会这样测试:

 mediatr.Send(myMessage)
        .Returns(ci => myResponse);

 mediatr.Send(myMessage2)
        .Returns(ci => myResponse2);

有几种方法可以覆盖以前抛出的存根,但我认为最好的方法是尽可能避免该问题。 :)

在提供更多信息后进行编辑: 这看起来像 a bug in NSubstitute's Arg.Any handling。解决方法是使用 Arg.Is<MyMessage>(x => x!=null),如该问题描述中所示。总的来说,我会更具体地关注存根,以避免按照我原来的回答重叠调用。