NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题

Posted

技术标签:

【中文标题】NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题【英文标题】:Mock Elasticsearch client in NEST having problem with async search method 【发布时间】:2018-11-29 16:31:04 【问题描述】:

我正在使用 NEST 框架在 c# 中进行弹性搜索查询。

我正在用 Moq 编写一个简单的单元测试。

mockElasticClient.Setup(ec => ec.SearchAsync(
                                    It.IsAny<Func<SearchDescriptor<Relativity>,
                                            SearchDescriptor<Relativity>>>()))
                                    .ReturnsAsync(mockSearchResponse.Object);

以上代码抛出'An expression tree may not contain a call or invocation that uses optional arguments'

如果我使用 Search 而不是 SearchAsync,上面的代码就可以工作。

我在这里做错了什么?

【问题讨论】:

***.com/questions/12413583/… 您必须手动传递具有默认值的参数。 谢谢。它真的帮助了我。 在下面这种情况下如何进行模拟,有人可以在这里帮助我吗,我也面临同样的问题。 ISearchResponse response = await _elasticClient.SearchAsync(s => s.Query(qry => qry.Raw(query))).ConfigureAwait(false); 【参考方案1】:

应考虑模拟函数中的所有参数。在这种情况下,从函数定义开始

    //
    // Parameters:
    //   selector:
    //     A descriptor that describes the parameters for the search operation
    //
    // Type parameters:
    //   T:
    //     The type used to infer the index and typename as well describe the query strongly
    //     typed
    Task<ISearchResponse<T>> SearchAsync<T>(Func<SearchDescriptor<T>, ISearchRequest> selector = null, CancellationToken cancellationToken = default) where T : class;

有两个参数 Funcselector 和 CancellationToken。

模拟要求 CancellationToken 如下所示进行模拟

mockElasticClient.Setup(x => x
            .SearchAsync(It.IsAny<Func<SearchDescriptor<Relativity>, ISearchRequest>>(),It.IsAny<CancellationToken>()))
            .ReturnsAsync(mockSearchResponse.Object);

【讨论】:

以上是关于NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NEST 更新 ElasticSearch 索引中的现有文档?

使用 C# 中的 NEST 库调用 elasticsearch 时,如何向 linq 语句添加条件逻辑?

Elasticsearch搜索查询以检索所有记录NEST

如何在 NEST2 中更新 Elasticsearch 文档

在 Elasticsearch NEST 中的索引间歇性失败后立即调用 Search

ElasticSearch NEST 搜索