当前位置: 首页 > 面试题库 >

ElasticSearch NEST 5.6.1查询单元测试

阎伟志
2023-03-14
问题内容

我写了一堆查询来进行elasticsearch,我想为它们写一个单元测试。使用此后最小的量,可以进行弹性连接,从而可以进行一般的模拟。但是,当我尝试查看由查询生成的Json时,我没有设法以任何方式获取它。我试图按照这个帖子elsatic查询起订量,但它是只与旧版本的巢的,因为该方法ConnectionStatusRequestInformation不再为ISearchResponse对象。

我的测试如下:

[TestMethod]
 public void VerifyElasticFuncJson()
{
//Arrange
var elasticService = new Mock<IElasticService>();
var elasticClient = new Mock<IElasticClient>();
var clinet = new ElasticClient();
var searchResponse = new Mock<ISearchResponse<ElasticLog>>();
elasticService.Setup(es => es.GetConnection())
    .Returns(elasticClient.Object);

elasticClient.Setup(ec => ec.Search(It.IsAny<Func<SearchDescriptor<ElasticLog>, 
                          ISearchRequest>>())).
                          Returns(searchResponse.Object);

//Act
var service = new ElasticCusipInfoQuery(elasticService.Object);
var FindFunc = service.MatchCusip("CusipA", HostName.GSMSIMPAPPR01, 
                                        LogType.Serilog);
var con = GetConnection();
var search =  con.Search<ElasticLog>(sd => sd
             .Type(LogType.Serilog)
             .Index("logstash-*")
             .Query(q => q
             .Bool(b => b
                    .Must(FindFunc)
                    )
               )     
             );
 **HERE I want to get the JSON** and assert it look as expected**
}

还有其他方法可以实现我的要求吗?


问题答案:

最好的方法是使用InMemoryConnection捕获请求字节并将其与期望的JSON比较。这就是单元测试NEST所做的。就像是

private static void Main()
{
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection())
        .DefaultIndex("default")
        .DisableDirectStreaming();

    var client = new ElasticClient(connectionSettings);

    // Act
    var searchResponse = client.Search<Question>(s => s
       .Query(q => (q
         .Match(m => m
               .Field(f => f.Title)
               .Query("Kibana")
         ) || q
         .Match(m => m
               .Field(f => f.Title)
               .Query("Elasticsearch")
               .Boost(2)
         )) && +q
         .Range(t => t
               .Field(f => f.Score)
               .GreaterThan(0)
         )
       )
    );

    var actual = searchResponse.RequestJson();

    var expected = new 
    {
        query = new {
            @bool = new {
                must = new object[] {
                    new {
                        @bool = new {
                            should = new object[] {
                                new {
                                    match = new {
                                        title = new {
                                            query = "Kibana"
                                        }
                                    }
                                },
                                new {
                                    match = new {
                                        title = new {
                                            query = "Elasticsearch",
                                            boost = 2d
                                        }
                                    }
                                }
                            },
                        }
                    },
                    new {
                        @bool = new {
                            filter = new [] {
                                new {
                                    range = new {
                                        score = new {
                                            gt = 0d
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    };

    // Assert
    Console.WriteLine(JObject.DeepEquals(JToken.FromObject(expected), JToken.Parse(actual)));
}

public static class Extensions
{
    public static string RequestJson(this IResponse response) =>
        Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}

我为预期的JSON使用了匿名类型,因为它比转义的JSON字符串更容易使用。

需要注意的一件事是,即使JSON对象中存在重复的对象键(只要最后一个键/值都匹配),Json.NET
JObject.DeepEquals(...)也会返回true。如果仅序列化NEST搜索,您不太可能会遇到某些事情,但是需要注意。

如果您要进行许多测试检查序列化,则需要创建一个实例ConnectionSettings并与所有人共享,以便可以利用其中的内部缓存,并且测试将比实例化新实例更快。在每个测试中。



 类似资料:
  • 问题内容: 我有一个接受查询,通过SQL服务器运行它,检查错误并返回结果的类。如何对该课程进行单元测试? 编辑 :我将尝试更精确: 负责将查询传递到服务器。为了测试它是否确实这样做,抛出正确的异常等,我想将其连接到将要填充的模拟数据库。我的问题是- 怎么做?如何创建一个模拟“服务器”来处理呼叫? 问题答案: 只需传递一个SQL查询,然后将返回的结果与预期的结果进行比较即可。简单的。JUnit是一个

  • 我有一个类似于下面的场景(为了清楚起见进行了简化): 我想编写单元测试来验证我的查询筛选器(以及排序和限制调用)的正确性,但我想不出如何设置测试数据来这样做。 我试过模拟IMongoDatabase并设置GetCollection调用以返回模拟IMongoCollection,但这不是正确的方法,因为我需要对真正的MongoCollection调用FindAsync调用。 我研究了通过拆分GetC

  • 我有一个方法,当应用程序启动时在新任务中启动,当它结束时停止。该方法每半秒执行一些逻辑。我不知道该如何测试它——有线索吗? 其中,是一个来自DI的,而是一个 基本上,我想检查逻辑是否有效,以及是否以适当的间隔发送了正确的数据。如何使用xunit实现这一点? 编辑 我已经走到这一步了: 但是,这会导致测试失败,出现

  • 单元测试涉及测试软件应用程序的每个单元或单个组件。这是第一级软件测试。单元测试的目的是验证单元组件的性能。 单元是软件系统的单个可测试部分,并在应用程序软件的开发阶段进行测试。 此测试旨在测试隔离代码的正确性。单元组件是应用程序的单独功能或代码。白盒测试方法用于单元测试,通常由开发人员完成。 在测试级别层次结构中,单元测试是在集成和其他剩余测试级别之前完成的第一级测试。它使用模块进行测试,减少了等

  • 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进

  • 我们从 Hello World 项目入手,增加单元测试功能。 我们新家了一个名为hello-world-test的 Gradle 项目。 环境 Gradle 3.4.1 Spring Boot 1.5.2.RELEASE Thymeleaf 3.0.3.RELEASE Thymeleaf Layout Dialect 2.2.0 Spring Security Test 4.2.2.RELEASE