模拟弹性搜索响应 in.Net

Mock Elastic Search response in.Net

我有 Elastic Search Nest 库代码,需要模拟我从 Elastic Search 索引获得的响应。

var obj = service.Search<TestDocument>(new student().Query());
var Name= obj.Aggs.Terms("Name");

用于测试: 我在快速观察后创建了 Nest 对象,但面临问题 -Aggregations - 是内部保护的 属性,我无法设置此值。

                           new Nest.KeyedBucket<object>
                           {   
                               Key="XYZ school",
                               KeyAsString=null,
                               Aggregations=new Dictionary<string, IAggregationContainer>{}
                           }

请提出解决方案或我可以用来模拟弹性搜索嵌套对象的任何其他方法。

如果您真的想要存根来自客户端的响应,您可以使用 Moq

执行如下操作
var client = new Mock<IElasticClient>();

var searchResponse = new Mock<ISearchResponse<object>>();

var aggregations = new AggregateDictionary(new Dictionary<string, IAggregate> {
    ["Name"] = new BucketAggregate
    {
        Items = new List<KeyedBucket<object>>
        {
            new Nest.KeyedBucket<object>(new Dictionary<string, IAggregate>())
            {
                Key = "XYZ school",
                KeyAsString = null,
                DocCount = 5
            }
        }.AsReadOnly()
    }
});

searchResponse.Setup(s => s.Aggregations).Returns(aggregations);

client.Setup(c => c.Search<object>(It.IsAny<Func<SearchDescriptor<object>, ISearchRequest>>()))
    .Returns(searchResponse.Object);

var response = client.Object.Search<object>(s => s);

var terms = response.Aggregations.Terms("Name");

另一种方法是使用 InMemoryConnection and return known JSON in response to a request..

然而,出于测试目的,拥有一个 Elasticsearch 运行 实例并对其执行集成测试可能会更好。查看 Elastic.Xunit,它提供了一种简单的方法来启动 Elasticsearch 集群以进行测试。客户端在集成测试中使用它。

您可以从 the Appveyor feed 获得 Elastic.Xunit。