#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-запросов, вместо этого они выполняют поиск в базе данных.