Бесшумная неопределенная переменная в поле зрения при тестировании маршрута laravel

У меня есть ресурс 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

Но все же ошибка остается незамеченной.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
0
223
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы посоветовал добавить проверку на 200, прежде чем идти дальше

$this->assertEquals(200, $response->status());

Я попытался воспроизвести вашу проблему, и ответ в тесте такой же, как и в браузере: ответ 500 в обоих случаях.

Спасибо за ваше предложение. Проверка 200 выполняется через $response->assertSuccessful. Я на всякий случай обменял свой код на ваш, но результат тот же: тест проходит

rgmt 10.08.2018 12:24
Ответ принят как подходящий

Я нашел ответ: база данных не была заполнена экземплярами 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']
    );
}

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