问题描述
我正在为使用 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
对象。