Лучший способ сделать это - использовать 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
и общий доступ ко всем, чтобы вы могли воспользоваться внутренними кэшами внутри него, и ваши тесты будут выполняться быстрее, чем создание нового экземпляра в каждом тесте.