Интеграция или модульный тест

#laravel

Вопрос:

Мне не совсем ясно, когда я должен использовать интеграцию и модульный тест

Если я хочу протестировать следующий код без каких-либо http-запросов, следует ли мне использовать интеграционный тест или модуль ?

При создании потока действие записывается и запускается событие электронной почты

 ThreadObserver extends Observer
{
    public function created(Thread $thread)
    {
        Activity::record($thead);
        event(new ThreadWasCreated($thread);
     }
}
 
 class RecordsActivityTest
{
    public function it_records_the_acitivty_when_a_thread_is_created()
    {
        Thread::factory()->create();
        $this->assertDatabaseHas('activities', […]);
   
    }
    

}
 

Другой пример, я хочу протестировать, чтобы запрос возвращал ожидаемые результаты .

 class Search
{
     public function __construct(protected Index $index)
     {
            
      }

      public function handle($query)
      {
            $this->index->search($query);
             // more code 
       }
}
 
 class SearchTest
{
    public function it_returns_the_expected_result()
    {
        $search = new Search(new Index);
        $results = $search->handle(“some query”);
        $this->assertEquals(“some
    Data”);
    }

}


 

Нужен ли мне модульный тест для тестирования Search класса или интеграционный тест, потому что он зависит от другого класса ?

Комментарии:

1. Категории тестирования расплывчаты и самоуверенны. Чтобы получить представление о мнении Laravel, я считаю, что команда artisan для создания модульного теста расширяет класс простого теста phpunit, в то время как тест функций/интеграции расширяет базовый класс Laravel. Это означает, что модульный тест достаточно изолирован, чтобы не нуждаться в контейнере службы, но интеграционный тест сможет использовать любую функцию Laravel.

Ответ №1:

В первом примере я бы, скорее всего, написал интеграционный тест, но вместо того, чтобы проверять, имеет ли база данных значение, я бы просто издевался над событием https://laravel.com/docs/8.x/mocking#event-fake и утверждайте, что событие было отправлено.

Второй пример, однако, может пойти в любом случае. Вы можете написать модульный тест и просто издеваться над всем, или вы можете написать интеграционный тест, чтобы использовать помощников Laravel, в частности https://laravel.com/docs/8.x/mocking#http-fake если вы тестируете API, в противном случае издевательство, если вы тестируете, например, SDK.

Комментарии:

1. Разве смысл интеграционного теста не в том, чтобы проверить реальные классы, которые задействованы, вместо того, чтобы высмеивать все ? Итак, во 2-м примере, над чем бы вы посмеялись. Принимая во внимание, что они не делают никаких http-запросов, вместо этого они выполняют поиск в базе данных.