Результаты тестирования PhpUnit elasticsearch пусты

Я пишу методы тестирования своего приложения, и в своем приложении я использую 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);
}

Я понял, в чем проблема, но не знаю, как ее решить. Эластичный поиск не индексирует созданный пост. Он должен быть проиндексирован.

user7850120 27.08.2018 22:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
1 208
2

Ответы 2

Я уверен, что почти год спустя вы переехали.

Вы заявили:

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 секунду решила проблему. Это время дало эластичность для получения всех данных, созданных во время тестирования.

user7850120 09.07.2019 08:47

Я знаю, что это старый пост, но я добавляю туда ответ, который нашел для этой проблемы. Все, что вам нужно, чтобы убедиться, что ваши данные проиндексированы перед запросом, - это вызвать refresh по индексу, который вы только что написали. Это заставляет ES индексировать данные, поэтому вы уверены, что данные есть, когда вы их запрашиваете! И он быстрее, чем sleep(1);, как предлагает автор =)

Вы можете найти официальную документацию ElasticSearch об этом здесь.

Надеюсь, это кому-то поможет.

Другие вопросы по теме