2017-03-09 48 views
1

我是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

一般情況下我測試這更像是:

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),如問題描述中所示。總的來說,我會更專注地根據原始答案避免重複呼叫。

+0

我也會這樣做,但測試是爲了證明NSubstitute的行爲。重構它以環繞該問題沒有意義:) – Serguzest

+0

您是否有更現實的問題示例?沒有更多的上下文很難提出建議。一般來說,通過更改順序來避免這個問題,最糟糕的情況是使用閉包/ Func,稍後可以更改或者將更多邏輯放入回調中。或者查看When Do語法是否可以提供幫助。 –

+0

David,我用更多的細節更新了我的問題 – Serguzest

相關問題