2016-07-05 38 views
1

我想添加測試,我們使用ElasticSearch(在C#中使用嵌套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(); 
     } 
    } 
} 

查詢成功,但沒有找到我只是索引文件的歸結例子...

如果我更新到版本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收到任何響應;在連接設置(或NEST 2.x +中的.OnRequestCompleted())上與.SetConnectionStatusHandler()一起使用時,可以很方便地查看序列化的請求形式。

當不使用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上,如果儘管聲明瞭序列化的請求,但這是您想要採用的路線t符合你在SUT的期望可能就足夠了。

+0

啊,謝謝!我知道我必須錯過一些東西。我正在調查這件事,因爲我會打牆嘲笑。我想我需要打開一個新的問題:) –

相關問題