2016-07-05 2 views
1

ElasticSearch (Cest # Nest 1.4.2)를 사용하여 테스트를 추가하려고하고 InMemoryConnection을 사용하려고하지만 무언가를 놓치고 있습니다. 성공하지 못했습니다.InMemoryConnection을 사용하여 ElasticSearch 테스트하기

내 문제

using System; 
using Elasticsearch.Net.Connection; 
using FluentAssertions; 
using Nest; 
using NUnit.Framework; 

namespace NestTest 
{ 
    public class InMemoryConnections 
    { 
     public class TestThing 
     { 
      public string Stuff { get; } 

      public TestThing(string stuff) 
      { 
       Stuff = stuff; 
      } 
     } 

     [Test] 
     public void CanBeQueried() 
     { 
      var connectionSettings = new ConnectionSettings(new Uri("http://foo.test"), "default_index"); 

      var c = new ElasticClient(connectionSettings, new InMemoryConnection(connectionSettings)); 
      c.Index(new TestThing("peter rabbit")); 

      var result = c.Search<TestThing>(sd => sd); 

      result.ConnectionStatus.Success.Should().BeTrue(); 
     } 
    } 
} 

쿼리가 성공하지만 난 그냥 인덱스 문서를 찾을 수없는의 다운 삶은 예로서이 간단한 NUNIT 테스트 케이스를 만들었습니다

...

하는 경우 나는 NEST 버전 2.3.3과 새로운 구문으로 업데이트

 [Test] 
     public void CanBeQueried() 
     { 

      var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
      var settings = new ConnectionSettings(connectionPool, new InMemoryConnection()); 
      settings.DefaultIndex("default"); 

      var c = new ElasticClient(settings); 

      c.Index(new TestThing("peter rabbit")); 

      var result = c.Search<TestThing>(sd => sd); 

      result.CallDetails.Success.Should().BeTrue(); 
      result.Documents.Single().Stuff.Should().Be("peter rabbit"); 
     } 

는 ... 쿼리가 성공적으로보고, 즉 같은 방법으로 실패하지만 0 문서

을 반환

답변

3

InMemoryConnection 실제로 요청을 보내지 않거나 Elasticsearch에서 응답을받지 않습니다. 연결 설정에서 .SetConnectionStatusHandler() (또는 NEST 2.x +에서 .OnRequestCompleted())과 함께 사용하면 직렬화 된 요청 형식을 볼 수있는 편리한 방법입니다.

InMemoryConnection를 사용하지만 여전히 NEST 버전에 따라, .SetConnectionStatusHandler() 또는 .OnRequestCompleted()을 설정하지 않는, 그것은 .ExposeRawResponse(true)도 NEST 1.x에서의 설정, 또는 .DisableDirectStreaming()이 NEST 2.x에서에 설정되어있는 경우, 또한 응답을 볼 수있는 편리한 방법 + 로 나타났다.

NEST 1.x의 예와

void Main() 
{ 
    var settings = new ConnectionSettings(new Uri("http://localhost:9200")) 
     .ExposeRawResponse(true) 
     .PrettyJson() 
     .SetDefaultIndex("myIndexName") 
     .MapDefaultTypeNames(d => d.Add(typeof(myPoco), string.Empty)) 
     .SetConnectionStatusHandler(r => 
     { 
      // log out the requests 
      if (r.Request != null) 
      { 
       Console.WriteLine("{0} {1} \n{2}\n", r.RequestMethod.ToUpperInvariant(), r.RequestUrl, 
        Encoding.UTF8.GetString(r.Request)); 
      } 
      else 
      { 
       Console.WriteLine("{0} {1}\n", r.RequestMethod.ToUpperInvariant(), r.RequestUrl); 
      } 

      Console.WriteLine(); 

      if (r.ResponseRaw != null) 
      { 
       Console.WriteLine("Status: {0}\n{1}\n\n{2}\n", r.HttpStatusCode, Encoding.UTF8.GetString(r.ResponseRaw), new String('-', 30)); 
      } 
      else 
      { 
       Console.WriteLine("Status: {0}\n\n{1}\n", r.HttpStatusCode, new String('-', 30)); 
      } 
     }); 

    var client = new ElasticClient(settings, new InMemoryConnection()); 

    int skipCount = 0; 
    int takeSize = 100; 

    var searchResults = client.Search<myPoco>(x => x 
     .Query(q => q 
     .Bool(b => b 
     .Must(m => 
      m.Match(mt1 => mt1.OnField(f1 => f1.status).Query("New"))))) 
     .Skip(skipCount) 
     .Take(takeSize) 
    ); 
} 

public class myPoco 
{ 
    public string status { get; set;} 
} 

수율

POST http://localhost:9200/myIndexName/_search?pretty=true 
{ 
    "from": 0, 
    "size": 100, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "status": { 
       "query": "New" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 


Status: 0 
{ "USING NEST IN MEMORY CONNECTION" : null } 

------------------------------ 

둥지 2.x를

void Main() 
{ 
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var defaultIndex = "default-index"; 
    var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection()) 
      .DefaultIndex(defaultIndex) 
      .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}"); 
        } 

        Console.WriteLine(); 

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

    int skipCount = 0; 
    int takeSize = 100; 

    var searchResults = client.Search<myPoco>(x => x 
     .Query(q => q 
     .Bool(b => b 
     .Must(m => 
      m.Match(mt1 => mt1.Field(f1 => f1.status).Query("New"))))) 
     .Skip(skipCount) 
     .Take(takeSize) 
    ); 
} 

You can of course mock/stub responses from the client using your favourite mocking framework 및 경우, 클라이언트 인터페이스 IElasticClient에 따라 그것은 당신이 취하기를 원하는 경로입니다. 그러나 일련의 요청 형태를 요구합니다. t는 SUT에서 기대 한 것과 일치 할 수도 있습니다.

+0

아, 고마워! 나는 뭔가를 놓치고 있어야한다는 것을 알았다. 내가 벽을 조롱했기 때문에 나는 이것을 조사하고 있었다. 나는 새로운 질문을 열 필요가 있다고 생각한다 :) –