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