InMemoryConnection
實際上並未發送任何請求或從Elasticsearch收到任何響應;在連接設置(或NEST 2.x +中的.OnRequestCompleted()
)上與.SetConnectionStatusHandler()
一起使用時,可以很方便地查看序列化的請求形式。
當不使用InMemoryConnection
但仍設置.SetConnectionStatusHandler()
或.OnRequestCompleted()
,取決於NEST版本,這是一個方便的方法也看到了迴應,當.ExposeRawResponse(true)
也設置在NEST 1.x中,或.DisableDirectStreaming()
在NEST 2.X設置+ , 分別。
與NEST 1.x的一個例子
void Main()
{
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.ExposeRawResponse(true)
.PrettyJson()
.SetDefaultIndex("myIndexName")
.MapDefaultTypeNames(d => d.Add(typeof(myPoco), string.Empty))
.SetConnectionStatusHandler(r =>
{
// log out the requests
if (r.Request != null)
{
Console.WriteLine("{0} {1} \n{2}\n", r.RequestMethod.ToUpperInvariant(), r.RequestUrl,
Encoding.UTF8.GetString(r.Request));
}
else
{
Console.WriteLine("{0} {1}\n", r.RequestMethod.ToUpperInvariant(), r.RequestUrl);
}
Console.WriteLine();
if (r.ResponseRaw != null)
{
Console.WriteLine("Status: {0}\n{1}\n\n{2}\n", r.HttpStatusCode, Encoding.UTF8.GetString(r.ResponseRaw), new String('-', 30));
}
else
{
Console.WriteLine("Status: {0}\n\n{1}\n", r.HttpStatusCode, new String('-', 30));
}
});
var client = new ElasticClient(settings, new InMemoryConnection());
int skipCount = 0;
int takeSize = 100;
var searchResults = client.Search<myPoco>(x => x
.Query(q => q
.Bool(b => b
.Must(m =>
m.Match(mt1 => mt1.OnField(f1 => f1.status).Query("New")))))
.Skip(skipCount)
.Take(takeSize)
);
}
public class myPoco
{
public string status { get; set;}
}
產量
POST http://localhost:9200/myIndexName/_search?pretty=true
{
"from": 0,
"size": 100,
"query": {
"bool": {
"must": [
{
"match": {
"status": {
"query": "New"
}
}
}
]
}
}
}
Status: 0
{ "USING NEST IN MEMORY CONNECTION" : null }
------------------------------
而對於NEST 2.x的
void Main()
{
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var defaultIndex = "default-index";
var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection())
.DefaultIndex(defaultIndex)
.PrettyJson()
.DisableDirectStreaming()
.OnRequestCompleted(response =>
{
// log out the request
if (response.RequestBodyInBytes != null)
{
Console.WriteLine(
$"{response.HttpMethod} {response.Uri} \n" +
$"{Encoding.UTF8.GetString(response.RequestBodyInBytes)}");
}
else
{
Console.WriteLine($"{response.HttpMethod} {response.Uri}");
}
Console.WriteLine();
// log out the response
if (response.ResponseBodyInBytes != null)
{
Console.WriteLine($"Status: {response.HttpStatusCode}\n" +
$"{Encoding.UTF8.GetString(response.ResponseBodyInBytes)}\n" +
$"{new string('-', 30)}\n");
}
else
{
Console.WriteLine($"Status: {response.HttpStatusCode}\n" +
$"{new string('-', 30)}\n");
}
});
var client = new ElasticClient(connectionSettings);
int skipCount = 0;
int takeSize = 100;
var searchResults = client.Search<myPoco>(x => x
.Query(q => q
.Bool(b => b
.Must(m =>
m.Match(mt1 => mt1.Field(f1 => f1.status).Query("New")))))
.Skip(skipCount)
.Take(takeSize)
);
}
You can of course mock/stub responses from the client using your favourite mocking framework和根據客戶端接口,IElasticClient
上,如果儘管聲明瞭序列化的請求,但這是您想要採用的路線t符合你在SUT的期望可能就足夠了。
啊,謝謝!我知道我必須錯過一些東西。我正在調查這件事,因爲我會打牆嘲笑。我想我需要打開一個新的問題:) –