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)
,如该问题描述中所示。总的来说,我会更具体地关注存根,以避免按照我原来的回答重叠调用。
我是 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)
,如该问题描述中所示。总的来说,我会更具体地关注存根,以避免按照我原来的回答重叠调用。