Я пишу методы тестирования своего приложения, и в своем приложении я использую elasticsearch. Когда я запускаю тестовый метод, который должен возвращать значения с помощью elasticsearch, ответ всегда пуст. Как решить проблему? Вот код, который я отправляю.
public function testGetPosts()
{
$brand = factory(Brand::class)->create();
$account = factory(Account::class)->create();
$post = factory(Post::class)->create();
$response = $this->actingAs($this->owner)->json(
'GET',
('/api/publish/posts'),
['account_id' => [(string) $account->id],
'skip' => 0]
);
$response->assertStatus(200);
}






Я уверен, что почти год спустя вы переехали.
Вы заявили:
Elastic search doesnt index the created post. It shuold be indexed Why would it be indexed? Unless, of course you have code to index in your
setUp(), or your testing against an external ES server and assuming it's always available and contains the exact data you're testing against.
Другое решение - имитировать запрос, поскольку Elasticsearch возвращает JSON. Все, что нам нужно сделать, это смоделировать HTTP-запрос со статусом 200 и вернуть JSON. Этот файл JSON мы можем поместить в наш каталог tests/, и он будет содержать образцы результатов, которые вернет Elasticsearch.
Пример теста хотел бы это;
$handler = new MockHandler([
'status' => 200,
'transfer_stats' => [
'total_time' => 100
],
'body' => fopen(base_path('tests/Unit/mockelasticsearch.json'), 'r')
]);
$builder = ClientBuilder::create();
$builder->setHosts(['testing']);
$builder->setHandler($handler);
$client = $builder->build();
$response = $client->search([
'index' => 'my_index',
'type' => 'my_type',
'body' => [
[
'query' => [
'simple_query_string' => [
'query' => 'john',
'fields' => ['name']
]
]
]
]
]);
// Test against the "$response", i.e., $this->assertEquals(2 ...) etc.
Затем в файле JSON, который вам нужно будет настроить на основе вашего индекса;
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 121668,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "test-type",
"_id": "1111",
"_score": 1,
"_source": {
"id": "1111",
"title": "Some Foo",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "2222",
"_score": 1,
"_source": {
"id": "2222",
"title": "Dolor Sit Amet",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "3333",
"_score": 1,
"_source": {
"id": "3333",
"title": "Consectetur Adipiscing Elit",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "4444",
"_score": 1,
"_source": {
"id": "4444",
"title": "Sed Do Eiusmod",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "5555",
"_score": 1,
"_source": {
"id": "5555",
"title": "Tempor Incididunt",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "6666",
"_score": 1,
"_source": {
"id": "6666",
"title": "Ut Labore Et Dolore",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "7777",
"_score": 1,
"_source": {
"id": "7777",
"title": "Magna Aliqua",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "8888",
"_score": 1,
"_source": {
"id": "8888",
"title": "Ut Enim Ad Minim",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "9999",
"_score": 1,
"_source": {
"id": "9999",
"title": "Veniam, Quis Nostrud",
"timestamp": "2017-08-02T15:45:22-05:00"
}
},
{
"_index": "test",
"_type": "test-type",
"_id": "0000",
"_score": 1,
"_source": {
"id": "0000",
"title": "Exercitation Ullamco Laboris",
"timestamp": "2017-08-02T15:45:22-05:00"
}
}
]
}
}
Здравствуйте, спасибо за усилия через год. Я серьезно это ценю. Я помню решение, которое я получил здесь. Поскольку elasticsearch не получает данные, которые я создал во время тестирования, сразу же, установка метода sleep () на 1 секунду решила проблему. Это время дало эластичность для получения всех данных, созданных во время тестирования.
Я знаю, что это старый пост, но я добавляю туда ответ, который нашел для этой проблемы.
Все, что вам нужно, чтобы убедиться, что ваши данные проиндексированы перед запросом, - это вызвать refresh по индексу, который вы только что написали.
Это заставляет ES индексировать данные, поэтому вы уверены, что данные есть, когда вы их запрашиваете!
И он быстрее, чем sleep(1);, как предлагает автор =)
Вы можете найти официальную документацию ElasticSearch об этом здесь.
Надеюсь, это кому-то поможет.
Я понял, в чем проблема, но не знаю, как ее решить. Эластичный поиск не индексирует созданный пост. Он должен быть проиндексирован.