У меня есть ресурс deliverypoint
в моем проекте laravel. Код контроллера, связанный с маршрутом deliverypoints.index
, прост:
public function index()
{
return view('deliverypoints.index', [
'deliverypoints' => DeliveryPoint::all(),
]);
}
С видом deliverypoints.index
:
@extends('layouts.app')
@section('content')
<div class = "container">
<ul class = "row">
@foreach ($deliverypoints as $deliverypoint)
<li class = "col-12">{{ $deliveryPoint->id }}</li>
@endforeach
</ul>
</div>
@endsection
Здесь вы можете увидеть опечатку в теге li
: deliveryPoint->id
вместо deliverypoint->id
. Это вызывает ошибку «неопределенная переменная», когда я вручную тестирую маршрут в моем браузере: пока все хорошо.
Моя проблема в том, что при тестировании маршрута с помощью PHPUnit тест проходит, а не сообщает об ошибке. Вот код теста функции:
public function testIndex()
{
$response = $this->get(
route('deliverypoints.index')
);
$response->assertSuccessful()->assertViewIs(
'deliverypoints.index'
)->assertViewHasAll(
['deliverypoints']
);
}
Поскольку тест пройден, я думаю, что представление было успешно возвращено сервером, но я ожидал, что опечатка будет обнаружена.
Как я могу заставить тест видеть такие ошибки?
Я использую laravel v5.6 с PHP v7.1.18 и PHPUnit v7.2.6.
Обновлено:
Я пытался очистить кеш, используя:
php artisan cache:clear
php artisan view:clear
php artisan route:clear
Но все же ошибка остается незамеченной.
Я бы посоветовал добавить проверку на 200, прежде чем идти дальше
$this->assertEquals(200, $response->status());
Я попытался воспроизвести вашу проблему, и ответ в тесте такой же, как и в браузере: ответ 500 в обоих случаях.
Я нашел ответ: база данных не была заполнена экземплярами DeliveryPoint
. Таким образом, контроллер отправляет пустой массив представлению через DeliveryPoint::all
и цикл:
@foreach ($deliverypoints as $deliverypoint)
<li class = "col-12">{{ $deliveryPoint->id }}</li>
@endforeach
не был выполнен, ошибка замалчивается.
Возможное исправление с использованием фабрик:
public function testIndex()
{
factory(DeliveryPoint::class)->create(); // seed the database
$response = $this->get(
route('deliverypoints.index')
);
$response->assertSuccessful()->assertViewIs(
'deliverypoints.index'
)->assertViewHasAll(
['deliverypoints']
);
}
Спасибо за ваше предложение. Проверка 200 выполняется через
$response->assertSuccessful
. Я на всякий случай обменял свой код на ваш, но результат тот же: тест проходит