在嵌套中使用inmemoryconnection和对elasticsearch的多个调用

roejwanj  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(265)

我正在从模拟调用转向elasticsearch(通过nest)使用 InMemoryConnection 类和一些硬编码的json来模拟一个真正的elasticsearch来回答来自c代码的请求。工作得很好,比mock好得多,mock需要深入理解和了解如何实现嵌套,并且很容易中断。
我的问题是,如果我想模拟对elasticsearch的多个调用,我看不到任何简单的方法。 InMemoryConnection 仅接受单个json字符串:

var connection = new InMemoryConnection(Encoding.UTF8.GetBytes(json));

可以这样说,第一次调用返回x,第二次调用返回y。
在验证对elasticsearch的调用时也存在类似的问题。我可以用 OnRequestCompleted 设置两个布尔值如下:

OnRequestCompleted(response =>
{
    if (response.Uri.ToString().Contains("/blabla/_search")) {}
    else if (response.HttpMethod == HttpMethod.POST && response.Success && response.Uri.ToString().StartsWith("http://localhost:9200/blabla"))
        wasCalled = true;
    else // We don't expect any other calls
        failed = true;
})

当你对那些布尔值进行Assert的时候。但这感觉不对。
如有任何意见,我们将不胜感激。

k3fezbri

k3fezbri1#

InMemoryConnection 更倾向于单个请求/响应,而不是存根多个不同的请求/响应 IConnection 可以从中派生出来达到这个目的

public class TestConnection : InMemoryConnection
{
    private (byte[], int, string) DetermineResponse(RequestData requestData)
    {
        byte[] responseBody = null;
        int statusCode = 200;
        string contentType = RequestData.MimeType;

        // do the switching here e.g. ctor might take a dictionary of Predicate<RequestData> -> Responses
        if (requestData.Uri.AbsolutePath == "/_search")
        {
            responseBody = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new { }));
        }

        return (responseBody, statusCode, contentType);
    }

    public override TResponse Request<TResponse>(RequestData requestData)
    {
        var (responseBody, statusCode, contentType) = DetermineResponse(requestData);   
        return base.ReturnConnectionStatus<TResponse>(requestData, responseBody, statusCode, contentType);
    }

    public override Task<TResponse> RequestAsync<TResponse>(RequestData requestData, CancellationToken cancellationToken)
    {
        var (responseBody, statusCode, contentType) = DetermineResponse(requestData);   
        return base.ReturnConnectionStatusAsync<TResponse>(requestData, cancellationToken, responseBody, statusCode, contentType);
    }
}

类似这样的内容可能是对elasticsearch.net.virtualizedcluster的一个很好的补充。
在验证对elasticsearch的调用时也存在类似的问题。我可以使用onrequestcompleted设置几个布尔值,如下所示:
onrequestcompleted(response=>{if(response.uri.tostring().contains(“/blabla/\u search”)){}else if(response.httpmethod==httpmethod.post&&response.success&&response.uri.tostring().startswith(“http://localhost:9200/blabla“))wascalled=true;else//we't expected any other calls failed=true;})
而不是在 OnRequestCompleted ,我要么
把电话录下来 TestConnection 并Assert他们是在那里被召唤的。不过,我想知道,以这种方式Assert的是什么,是否可以从回应中推断出来。

Assert response.ApiCall

相关问题