Тест Laravel не проходит

Итак, я учусь делать тесты для своего приложения, и один из тестов, который он не хочет проходить, и вот логика: в основном, когда пользователь запрашивает домашнюю страницу, я ожидаю, что счетчик списка базы данных будет равен 0 , и это прошло, то я также ожидаю, что сеанс имеет ключ ошибки NoBook и здесь он не работает. это код, который я пробовал:

class BookDisplayManagmentTest extends TestCase
{
    use RefreshDatabase;

    /** @test */
    public function Show_error_message_when_there_is_no_book_to_display_in_index_page()
    {
        //Request the home page
        $response = $this->get(route('home'));

        // I expect the count on the database book equal 0
        $this->assertCount(0, book::all());

        //Then I also expect that the session will flash an error with key NoBook
        $response->assertSessionHasErrors('NoBook');
    }

}

Но проблема, я получаю эту ошибку:

Session is missing expected key [errors]. Failed asserting that false is true.

И код, который добавляет ошибку сеанса:

<?php

namespace App\Http\Controllers;

use App\Books;
use Illuminate\Http\Request;

class IndexController extends Controller
{
      /** @show index function */
        public function index()
        {
            $book = Books::paginate(7);
            if(!$book->count())
            {
                session()->now('NoBook','There is no books at the moment');
            }
            return view('index', compact('book'));
        }
}

person Cod3rMax    schedule 25.04.2020    source источник
comment
Можете ли вы поделиться кодом, который добавит ошибку в сеанс?   -  person Aaron Adrian    schedule 25.04.2020
comment
if(!$Book-›count()) { session()-›now('Нет книг','В данный момент книг нет'); }   -  person Cod3rMax    schedule 25.04.2020
comment
Пожалуйста, добавьте код к вашему первоначальному вопросу ????   -  person Christophe Hubert    schedule 25.04.2020
comment
попробуйте добавить $this->assertSessionHasErrors(); перед $response->assertSessionHasErrors('NoBook');   -  person Christophe Hubert    schedule 25.04.2020
comment
@ChristopheHubert, я добавил код   -  person Cod3rMax    schedule 25.04.2020
comment
@ChristopheHubert да, я добавил $this-›assertSessionHasErrors(), получая ту же проблему   -  person Cod3rMax    schedule 25.04.2020


Ответы (1)


Вы используете session(), который добавляет к сеансу ключ, который не является ключом ошибки.

Следовательно, поскольку вы не передаете ошибку от своего контроллера, ваш тест «успешно» завершается неудачно.

Если вы хотите передать ошибку сеансу, вы должны использовать MessageBag, например, используя следующий код:

      /** @show index function */
        public function index()
        {
            $book = Books::paginate(7);
            $errors = [];

            if(!$book->count())
            {
                $errors['NoBook'] = 'There is no books at the moment';
            }
            return view('index', compact('book'))->withErrors($errors);
        }

person Christophe Hubert    schedule 25.04.2020
comment
Я передаю ошибку сеанса session()-›now('Нет книги','На данный момент книг нет'); и я пробовал твой код тоже не работал - person Cod3rMax; 25.04.2020
comment
Пожалуйста, проверьте обновленное объяснение и исправленный код - person Christophe Hubert; 25.04.2020
comment
Большое спасибо, теперь я понял, что происходит, еще раз спасибо :) - person Cod3rMax; 25.04.2020
comment
Пожалуйста! Написание теста — это хороший способ поддерживать хорошие стандарты кодирования, продолжать кодирование и не забывайте проходить StackOverflow, чтобы поделиться своими знаниями ???? - person Christophe Hubert; 25.04.2020