2016-04-08 21 views
5

Sto riscontrando problemi nella creazione di Test unità per la ricerca utilizzando ElasticSearch con Nest.Test unità Nest ElasticSearch 2.0 con MOQ

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

codice di lavoro

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

Il risultato è sempre nullo, anche se faccio la seguente

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

Qualsiasi aiuto sarebbe apprezzato.

risposta

10

La firma dello Func<T1, T2> passata a It.IsAny<T>() non è corretta, quindi l'aspettativa di installazione non verrà mai soddisfatta. La firma dovrebbe essere

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

Un esempio di lavoro completa

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

Se non è necessario stub il cliente allora si può semplicemente utilizzare un vero e proprio client e impostare il IConnection a un'istanza di 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); 

In questo modo si potrebbe anche catturare le richieste se è necessario. Puoi fare un ulteriore passo avanti e creare la tua implementazione IConnection che restituisce le risposte stub.

+0

Grazie, questo è un buon inizio –

Problemi correlati