我为弹性搜索写了一堆查询,我想为它们编写一个单元测试 . 使用这篇文章moq an elastic connection我能够进行一般的 Mock . 但是当我试图查看从我的查询生成的Json时,我无法以任何方式获得它 . 我试着关注这篇文章elsatic query moq,但它仅与旧版本的Nest相关,因为方法 ConnectionStatus
和 RequestInformation
不再可用于 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**
}
有没有其他方法可以实现我的要求?
1 回答
执行此操作的最佳方法是使用
InMemoryConnection
捕获请求字节并将其与预期的JSON进行比较 . 这是NEST的单元测试 . 就像是我使用了一个匿名类型作为预期的JSON,因为它比转义的JSON字符串更容易使用 .
需要注意的一点是,即使JSON对象中存在重复的对象键,Json.NET的
JObject.DeepEquals(...)
也将返回true
(只要最后一个键/值匹配) . 如果您只是序列化NEST搜索,它会遇到's not likely something you'll,但需要注意的事项 .如果您想要创建
ConnectionSettings
的单个实例并与所有共享,那么您可以利用其中的内部缓存,并且您的测试将比在每个测试中实例化一个新实例更快地运行 .