将 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 搜索响应对象,甚至是单个聚合字典?

解决方法

看起来可以通过同时模拟连接和客户端,这是一个例子:

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 对象。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...