与NSubstitute在同一方法上允许多种安排吗?

时间:2017-03-09 03:45:54

标签: c# mocking nsubstitute

我是NSubstitute的新手。测试失败,因为第二种安排导致第一种调用,甚至在“行为”之前使其失败。我不确定我是否应该对同一种方法作出多重安排。但是我觉得不管怎样都不应该调用第一个排列,因为参数不匹配。

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);

    }

1 个答案:

答案 0 :(得分:1)

通常情况下我会测试它更像:

 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),如该问题说明中所示。总的来说,我会更专注于根据我的原始答案避免重复调用。