首页 > 解决方案 > 将 JSON 转换为有效的 ElasticSearch.NET 搜索响应对象以进行模拟

问题描述

我正在为使用 ElasticSearch.NET 从 ES 读取的系统编写一些测试。该程序将搜索结果转换为不同的格式。

我想在测试中做的是使用一个大的 JSON 文件作为 ES 的模拟响应,以测试转换器是否工作。

但是,我需要为转换器创建一个有效的ISearchResponse实例,而我发现模拟结果的唯一方法是手动创建层次结构中的每个对象,例如:

var aggregations = new AggregateDictionary(new Dictionary<string, IAggregate>
{
    ["my_aggregate"] = new BucketAggregate
    {
        Items = new List<IBucket>()
        {
            new DateHistogramBucket(new Dictionary<string, IAggregate>()
            {
                {
                    "key", new KeyedValueAggregate(){Value = 10, ValueAsString = "10"}
                }
            })
        }.AsReadOnly()
    }
});
searchResponse.Aggregations.Returns(info => new AggregateDictionary(aggregations));

但是,我想模拟一个更大的响应对象,而不必对其进行精确建模,因为这可能会导致无法预料的问题。

是否有某种序列化程序可用于将 JSON 对象转换为 ElasticSearch.NET 搜索响应对象,甚至是单个聚合字典?

标签: elasticsearch.net

解决方案


看起来可以通过一起模拟连接和客户端来实现,这是一个示例:

jsonObjectAsString是字符串格式的模拟 JSON。

var responseBytes = Encoding.UTF8.GetBytes(jsonObjectAsString);
var connection = new InMemoryConnection(responseBytes, 200); 
var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(connectionPool, connection).DefaultIndex("my_aggregate");
var client = new ElasticClient(settings);
var searchResponse = client.Search<WebhookTotalTimeRecord>();

searchResponse是具有正确数据的有效ISearchResponse对象。


推荐阅读