ElasticSearch NEST 5.6.1 Запрос для юнит-теста - PullRequest
0 голосов
/ 12 июня 2018

Я написал несколько запросов для упругого поиска и хотел написать для них модульный тест.используя этот пост moq эластичное соединение я смог подготовить общий насмешливый.Но когда я попытался просмотреть Json, сгенерированный по моему запросу, мне так и не удалось его получить.Я пытался следить за этим постом elsatic query moq , но он относится только к более старым версиям Nest, потому что метод ConnectionStatus и RequestInformation больше не доступен для объекта ISearchResponse.

Мой тест выглядит следующим образом:

[TestMethod]
 public void VerifyElasticFuncJson()
{
//Arrange
var elasticService = new Mock<IElasticService>();
var elasticClient = new Mock<IElasticClient>();
var clinet = new ElasticClient();
var searchResponse = new Mock<ISearchResponse<ElasticLog>>();
elasticService.Setup(es => es.GetConnection())
    .Returns(elasticClient.Object);

elasticClient.Setup(ec => ec.Search(It.IsAny<Func<SearchDescriptor<ElasticLog>, 
                          ISearchRequest>>())).
                          Returns(searchResponse.Object);

//Act
var service = new ElasticCusipInfoQuery(elasticService.Object);
var FindFunc = service.MatchCusip("CusipA", HostName.GSMSIMPAPPR01, 
                                        LogType.Serilog);
var con = GetConnection();
var search =  con.Search<ElasticLog>(sd => sd
             .Type(LogType.Serilog)
             .Index("logstash-*")
             .Query(q => q
             .Bool(b => b
                    .Must(FindFunc)
                    )
               )     
             );
 **HERE I want to get the JSON** and assert it look as expected**
}

Есть ли другой способ добиться того, что я прошу?

1 Ответ

0 голосов
/ 12 июня 2018

Лучший способ сделать это - использовать InMemoryConnection для захвата байтов запроса и сравнения его с ожидаемым JSON.Это то, что делают модульные тесты для NEST.Что-то вроде

private static void Main()
{
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection())
        .DefaultIndex("default")
        .DisableDirectStreaming();

    var client = new ElasticClient(connectionSettings);

    // Act
    var searchResponse = client.Search<Question>(s => s
       .Query(q => (q
         .Match(m => m
               .Field(f => f.Title)
               .Query("Kibana")
         ) || q
         .Match(m => m
               .Field(f => f.Title)
               .Query("Elasticsearch")
               .Boost(2)
         )) && +q
         .Range(t => t
               .Field(f => f.Score)
               .GreaterThan(0)
         )
       )
    );

    var actual = searchResponse.RequestJson();

    var expected = new 
    {
        query = new {
            @bool = new {
                must = new object[] {
                    new {
                        @bool = new {
                            should = new object[] {
                                new {
                                    match = new {
                                        title = new {
                                            query = "Kibana"
                                        }
                                    }
                                },
                                new {
                                    match = new {
                                        title = new {
                                            query = "Elasticsearch",
                                            boost = 2d
                                        }
                                    }
                                }
                            },
                        }
                    },
                    new {
                        @bool = new {
                            filter = new [] {
                                new {
                                    range = new {
                                        score = new {
                                            gt = 0d
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    };

    // Assert
    Console.WriteLine(JObject.DeepEquals(JToken.FromObject(expected), JToken.Parse(actual)));
}

public static class Extensions
{
    public static string RequestJson(this IResponse response) =>
        Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}

Я использовал анонимный тип для ожидаемого JSON, так как с ним легче работать, чем с экранированной строкой JSON.

Следует отметить, что JObject.DeepEquals(...) в Json.NET вернет true, даже если в объекте JSON есть повторяющиеся ключи объекта (при условии совпадения последнего ключа / значения).Это вряд ли что-то, с чем вы столкнетесь, если вы только сериализуете поиск NEST, но что-то нужно знать.

Если у вас будет много тестов, проверяющих сериализацию, вы захотите создатьодин экземпляр ConnectionSettings и общий доступ ко всем, чтобы вы могли воспользоваться внутренними кэшами внутри него, и ваши тесты будут выполняться быстрее, чем создание нового экземпляра в каждом тесте.

...