2016-04-08 16 views
5

Tôi đang gặp sự cố khi tạo kiểm tra Đơn vị cho tìm kiếm bằng cách sử dụng Tìm kiếm Đàn hồi với Nest.Thử nghiệm Đơn vị Tổ chức Tìm kiếm Đàn hồi 2.0 với 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()); 

đang làm việc

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

Kết quả luôn luôn là null, ngay cả khi tôi làm như sau

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

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

10

Chữ ký của Func<T1, T2> được chuyển đến It.IsAny<T>() không chính xác để kỳ vọng thiết lập sẽ không bao giờ khớp. Chữ ký nên

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

Một ví dụ làm việc toàn

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

Nếu bạn không cần phải cuống khách hàng sau đó bạn chỉ có thể sử dụng một khách hàng thực tế và thiết lập các IConnection đến một thể hiện của 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); 

Bằng cách này bạn cũng có thể nắm bắt được yêu cầu nếu bạn cần. Bạn có thể thực hiện bước này thêm một bước nữa và tạo triển khai thực hiện IConnection của riêng bạn để trả về các câu trả lời sơ khai.

+0

Cảm ơn, đây là một khởi đầu tốt –

Các vấn đề liên quan