2016-07-05 2 views
1

Я пытаюсь добавить тестирование вокруг нашего использования ElasticSearch (в C# с использованием Nest 1.4.2) и хочу использовать InMemoryConnection, но я что-то пропускаю (полагаю) и не добился успеха.Использование InMemoryConnection для проверки ElasticSearch

Я создал этот простой NUnit тест, как сводился пример моего вопроса

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

запрос успешен, но не находит документ, который я просто проиндексирован ...

Если Я обновление до версии 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() на настройках подключения (или .OnRequestCompleted() в NEST 2.x +), это удобный способ увидеть сериализованную форму запросов.

Когда не используется InMemoryConnection, но до сих пор установка .SetConnectionStatusHandler() или .OnRequestCompleted(), в зависимости от версии NEST, это удобный способ также видеть ответы, когда .ExposeRawResponse(true) также устанавливается в НЕСТ 1.x или .DisableDirectStreaming() устанавливается в НЕСТ 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 } 

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

И для NEST 2.х

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

А, спасибо! Я знал, что мне что-то не хватает. Я расследовал это, потому что я ударил по стене, насмехаясь. Думаю, мне нужно открыть новый вопрос :) –

Смежные вопросы