2016-04-08 20 views
5

Nestを使用したElasticSearchを使用した検索のユニットテストの作成に問題があります。ElasticSearch 2.0ネストユニットのMOQによるテスト

ユニットテスト

var mockSearchResponse = new Mock<ISearchResponse<Person>>(); 
mockSearchResponse.Setup(x => x.Documents).Returns(_people); 

var mockElasticClient = new Mock<IElasticClient>(); 
mockElasticClient.Setup(x => x.Search(It.IsAny<Func<SearchDescriptor<Person>, SearchRequest<Person>>>())).Returns(mockSearchResponse.Object); 
var service = new PersonService(mockElasticClient.Object); 
var result = service.Search(string.Empty, string.Empty); 
Assert.AreEqual(2,result.Count()); 

の作業コード

results = ConnectionClient.Search<Person>(s => s.Index("person_index").Query(q => q.Term(t => t.Id, searchValue))).Documents; 

結果は、私は任意の助けをいただければ幸いです

var temp = ConnectionClient.Search<Person>(s => s.Index("person_index").Query(q => q.Term(t => t.Id, searchValue))); 

以下の場合でも、常にnullです。

答えて

10

Func<T1, T2>の署名がIt.IsAny<T>()に渡されているため、セットアップの期待値が決して一致しません。あなたはスタブクライアントその後、あなたは、単に実際のクライアントを使用してのインスタンスにIConnectionを設定することができますする必要がない場合、署名は完全な作業例

void Main() 
{ 
    var people = new List<Person> 
    { 
     new Person { Id = 1 }, 
     new Person { Id = 2 }, 
    }; 

    var mockSearchResponse = new Mock<ISearchResponse<Person>>(); 
    mockSearchResponse.Setup(x => x.Documents).Returns(people); 

    var mockElasticClient = new Mock<IElasticClient>(); 
    mockElasticClient.Setup(x => x 
     .Search(It.IsAny<Func<SearchDescriptor<Person>, ISearchRequest>>())) 
     .Returns(mockSearchResponse.Object); 

    var result = mockElasticClient.Object.Search<Person>(s => s); 

    Assert.AreEqual(2, result.Documents.Count()).Dump(); 
} 

public class Person 
{ 
    public int Id { get; set;} 
} 

It.IsAny<Func<SearchDescriptor<Person>, ISearchRequest>>() 

する必要がありますInMemoryConnection

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
// pass an instance of InMemoryConnection so that requests are not 
// **actually** sent 
var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection()) 
     .PrettyJson() 
     .DisableDirectStreaming() 
     .OnRequestCompleted(response => 
      { 
       // log out the request 
       if (response.RequestBodyInBytes != null) 
       { 
        Console.WriteLine(
         $"{response.HttpMethod} {response.Uri} \n" + 
         $"{Encoding.UTF8.GetString(response.RequestBodyInBytes)}"); 
       } 
       else 
       { 
        Console.WriteLine($"{response.HttpMethod} {response.Uri}"); 
       } 

       // log out the response 
       if (response.ResponseBodyInBytes != null) 
       { 
        Console.WriteLine($"Status: {response.HttpStatusCode}\n" + 
          $"{Encoding.UTF8.GetString(response.ResponseBodyInBytes)}\n" + 
          $"{new string('-', 30)}\n"); 
       } 
       else 
       { 
        Console.WriteLine($"Status: {response.HttpStatusCode}\n" + 
          $"{new string('-', 30)}\n"); 
       } 
      }); 

var client = new ElasticClient(connectionSettings); 

このようにして、必要に応じてリクエストを取得することもできます。これをさらに進めて、スタブの応答を返す独自のIConnection実装を作成することもできます。

+0

ありがとう、これは良いスタートです –

関連する問題