问题描述
我从模拟调用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
中断言
- 在
TestConnection
中记录呼叫,并断言那里已被呼叫。我想知道是否可以从响应中以某种方式推断出以此方式断言的内容。
或
- 对
response.ApiCall
进行断言