在NEST中将InMemoryConnection与多个对Elasticsearch的调用一起使用

问题描述

我从模拟调用Elasticsearch(通过nesT)转向使用InMemoryConnection类和一些硬编码的JSON来模拟真实的Elasticsearch,以回答从C#代码发出的请求。效果比模拟更好,并且比模拟更好,模拟需要对nesT的实现方式有深入了解和知识,并且非常容易破解。

我的问题是,如果我想模拟对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;
})

在声明这些布尔值时。但这感觉不对。

任何想法都会受到赞赏。

解决方法

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,contentType) = DetermineResponse(requestData);   
        return base.ReturnConnectionStatus<TResponse>(requestData,responseBody,contentType);
    }

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

类似的事情可能是对Elasticsearch.Net.VirtualizedCluster的一个很好的补充。

类似的问题是在验证对Elasticsearch的调用时。我可以用 OnRequestCompleted可以设置几个布尔值,如下所示:

OnRequestCompleted(response => { 如果(response.Uri.ToString()。Contains(“ / blabla / _search”)){} 否则if(response.HttpMethod == HttpMethod.POST && response.Success && response.Uri.ToString()。StartsWith(“ http:// localhost:9200 / blabla”)) wasCalled = true; else //我们不希望有其他电话 失败=真; })

我会而不是在OnRequestCompleted中断言

  1. TestConnection中记录呼叫,并断言那里已被呼叫。我想知道是否可以从响应中以某种方式推断出以此方式断言的内容。

  1. response.ApiCall进行断言

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...