2016-07-05 4 views
1

私はElasticSearch(C#で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を使用して、それでも.SetConnectionStatusHandler()または.OnRequestCompleted()を設定し、NESTのバージョンに依存しない場合は.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 } 

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

そしてNEST 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に応じて、これは、あなたが取るべきルートですが、要求のシリアライズされた形式を主張していますあなたの期待とSUTで合っていれば十分でしょう。

+0

ああ、ありがとう!私は何かが欠けているに違いないことを知っていた。私は壁をぶらつくので、私はこれを調べていた。私は新しい質問を開く必要があると思う:) –

関連する問題