2016-04-08 9 views
5

Ich habe Probleme beim Erstellen von Unit-Test für die Suche mit ElasticSearch mit Nest.ElasticSearch 2.0 Nest Unit Testen mit MOQ

Einheit Test

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()); 

Arbeits Code

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

Das Ergebnis ist immer null, auch wenn ich folgendes tun

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

Jede Hilfe würde geschätzt.

Antwort

10

Die Signatur des Func<T1, T2>, die an It.IsAny<T>() übergeben wurde, ist nicht korrekt, daher wird die Setup-Erwartung nie erreicht. Die Signatur sollte

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

Ein voll funktionierendes Beispiel

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;} 
} 

Wenn Sie brauchen nicht zu Stummel der Client dann können Sie einfach einen echten Client verwenden und stellen Sie die IConnection auf eine Instanz 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); 

auf diese Weise können Sie auch die Anforderungen erfassen, wenn Sie benötigt werden. Sie könnten dies einen Schritt weiter gehen und Ihre eigene Implementierung erstellen, die Stub-Antworten zurückgibt.

+0

Danke, das ist ein guter Anfang –

Verwandte Themen