2017-03-09 4 views
1

私はNS代理店を初めて利用しています。 2番目の配置が最初の配置の呼び出しを引き起こし、それが "行為"の前であっても失敗するため、テストは失敗します。私は同じ方法で複数の取り決めをするべきかどうかはわかりません。しかし、パラメータが一致しないので、最初のアレンジを呼び出すべきではないという気がします。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を変更したり、後で変更したり、より多くのロジックをコールバックに入れたりすることで、この問題を回避してください。または、Do Do構文が役立つかどうかを確認してください。 –

+0

David、詳細をつけて質問を更新しました – Serguzest

関連する問題