2016-05-19 14 views
0

で受信:NSubstitute私はAPI持っCONCRETE式<機能<T, bool>>

public async Task<Merchant> GetByExternalId(string externalId) 
    { 
     return await this.repository.GetBy(merchant => merchant.ExternalId == externalId); 
    } 

をそして私はそれをテストしたい:

Expression<Func<Merchant, bool>> expression = merchant => merchant.ExternalId == externalId; 

しかし、この:

repository.Received(1).GetBy(expression); 

doesnの」仕事。

しかし、この作品:

repository.Received(1).GetBy(Arg.Any<Expression<Func<Merchant, bool>>>()); 

そして、どのように私はCONCRETE式に受信した試験ができますか?

答えて

0

ここにはいくつかのオプションがあると思います。

まず、問題をスキップして、リポジトリ呼び出しとは別にクエリをテストできます。たとえば、テスト対象のクラスでExternalIdQuery(string id)が公開されていて、ExternalIdと一致する場合にのみMerchantと一致することを確認します。次に、GetByへの呼び出しを受け取ったリポジトリをチェックします。これは完全なプロセスをテストするものではありません(正しいクエリを使用したことを保証するものではありません)が、特に高レベルのテストがある場合は十分です。 (実際には、メモリ内のレポなどのテストを代わりに使用したいと思っていますが、このテストは、システムが期待どおりに動作することを保証するものではありません)。

しかし、現在のアプローチに固執したいのであれば、式ツリーが正しいかどうか(yuck)、関数に渡される式が期待どおりに機能するかどうかを確認することができます。これを行うには

[Test] 
    public void TestLookup() 
    { 
     var repo = Substitute.For<IRepo>(); 
     var sut = new Sut (repo); 
     sut.GetByExtId ("123"); 

     repo.Received (1).GetBy (Arg.Is<Expression<Func<Merchant, bool>>> (x => ComparesMerchantId (x))); 
    } 

    bool ComparesMerchantId (Expression<Func<Merchant, bool>> x) 
    { 
     // Option 1: inspect expression tree and make sure it matches what you want. 

     // Option 2: run the expression and check it behaves as you expect. 
     var f = x.Compile(); 
     return f (new Merchant { ExternalId = "123" }) && !f (new Merchant { ExternalId = "999" }); 
    } 

もう一つの方法は、GetByコールで使用されるクエリをキャプチャし、それをチェックするために、標準的なアサーションを使用することです:

[Test] 
    public void TestLookup2() 
    { 
     var repo = Substitute.For<IRepo>(); 
     var sut = new Sut (repo); 
     Func<Merchant, bool> query = x => false; 
     repo.GetBy (Arg.Do<Expression<Func<Merchant, bool>>> (x => query = x.Compile())); 

     sut.GetByExtId ("123"); 

     Assert.IsTrue(query (new Merchant { ExternalId = "123" })); 
     Assert.IsFalse(query (new Merchant { ExternalId = "123zxcv" })); 
    } 

は、この情報がお役に立てば幸いです。

関連する問題