.Net 中的 Mock Elastic Search 响应

piy*_*ush 2 elasticsearch nest elastic-stack elasticsearch-5

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

var obj = service.Search<TestDocument>(new student().Query());
var Name= obj.Aggs.Terms("Name");
Run Code Online (Sandbox Code Playgroud)

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

                           new Nest.KeyedBucket<object>
                           {   
                               Key="XYZ school",
                               KeyAsString=null,
                               Aggregations=new Dictionary<string, IAggregationContainer>{}
                           }
Run Code Online (Sandbox Code Playgroud)

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

Rus*_*Cam 5

如果您真的想存根来自客户端的响应,您可以使用 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");
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用InMemoryConnection并返回已知的 JSON 以响应请求。.

但是,出于测试目的,最好运行一个 Elasticsearch 实例,并针对它执行集成测试。看看Elastic.Xunit,它提供了一种简单的方法来启动 Elasticsearch 集群以进行测试。这是客户端在集成测试中使用的。

您可以从Appveyor feed获取 Elastic.Xunit 。