Модульное тестирование контроллеров Laravel

Я пытаюсь запустить новое приложение Laravel после TDD

Мой первый шаг - проверить, что контроллер /login вызывается на домашнем URL-адресе.

Несмотря на следующие несколько уроков, я не могу заставить тест работать, и я не вижу, что я делаю неправильно.

Моя настройка: композитор для установки laravel композитор для установки phpunit

вот мой маршрут:

<?php
Route::get('/login', '[email protected]');

мой контроллер:

<?php

class AuthenticationController extends BaseController {

    public function login () {
        return View::make('authentication.login');
    }

}

И мой тест:

<?php

class AuthenticationTest extends TestCase {

    public function testSomeTest () {

        $response = $this->action('GET', '[email protected]');

        $view = $response->original;

        $this->assertEquals('authentication.login', $view['name']);
    }
}

Ошибка, которую я получаю,

  ErrorException: Undefined index: name

Код как копия (в точности точно) с сайта Laravel, но он не запускается.

Может ли кто-нибудь увидеть, что я делаю неправильно?

Он утверждает, что $view не имеет имени индекса, но это не может быть правильным, как его пример на веб-сайте laravel, плюс представление визуализируется с использованием его имени (оно также верно отображается на лицевой части)

ИЗМЕНИТЬ::

Итак, из комментария, что секция тестирования единицы laravel не ясна и что $view ['name'] проверяет переменную с именем $name. Если это так, как вы тестируете используемый контроллер/маршрут, IE. какое имя контроллера/имя действия использовалось для маршрута ('X')

Ответ 1

Хорошо, как уже было немного объяснено в комментариях, позвольте сначала сделать шаг назад и подумать о сценарии.

"Мой первый шаг - проверить, что контроллер /login вызывается на домашнем URL-адресе".

Таким образом, это означает: когда пользователь попадает на домашний маршрут, вы хотите проверить, вошел ли пользователь в систему. Если нет, вы хотите перенаправить их на логин, возможно, с некоторым флэш-сообщением. После того, как они войдут в систему, вы хотите перенаправить их на домашнюю страницу. Если сбой входа в систему, вы хотите перенаправить их обратно в форму входа, возможно, также с флэш-сообщением.

Итак, есть несколько вещей, которые нужно проверить сейчас: домашний контроллер и контроллер входа. Поэтому, следуя духу TDD, сначала создайте тесты.

Примечание. Я последую за соглашением об именах, которое используется phpspec, но не позволяйте этому беспокоить вас.

class HomeControllerTest extends TestCase
{
    /**
     * @test
     */
    public function it_redirects_to_login_if_user_is_not_authenticated()
    {
        Auth::shouldReceive('check')->once()->andReturn(false);

        $response = $this->call('GET', 'home');

        // Now we have several ways to go about this, choose the
        // one you're most comfortable with.

        // Check that you're redirecting to a specific controller action 
        // with a flash message
        $this->assertRedirectedToAction(
             '[email protected]', 
             null, 
             ['flash_message']
        );

        // Only check that you're redirecting to a specific URI
        $this->assertRedirectedTo('login');

        // Just check that you don't get a 200 OK response.
        $this->assertFalse($response->isOk());

        // Make sure you've been redirected.
        $this->assertTrue($response->isRedirection());
    }

    /**
     * @test
     */
    public function it_returns_home_page_if_user_is_authenticated()
    {
        Auth::shouldReceive('check')->once()->andReturn(true);

        $this->call('GET', 'home');

        $this->assertResponseOk();
    }
}

И что это для Домашнего контроллера. В большинстве случаев вам все равно, куда вы перенаправлены, потому что это может измениться со временем, и вам придется менять тесты. Таким образом, самое меньшее, что вы должны сделать, это проверить, переадресовываете ли вы или нет, и только проверьте более подробную информацию, если вы действительно считаете, что это важно для вашего теста.

Посмотрим на контроллер проверки подлинности:

class AuthenticationControllerTest extends TestCase
{
    /**
     * @test
     */
    public function it_shows_the_login_form()
    {
        $response = $this->call('GET', 'login');

        $this->assertTrue($response->isOk());

        // Even though the two lines above may be enough,
        // you could also check for something like this:

        View::shouldReceive('make')->with('login');
    }

    /**
     * @test
     */
    public function it_redirects_back_to_form_if_login_fails()
    {
        $credentials = [
            'email' => '[email protected]',
            'password' => 'secret',
        ];

        Auth::shouldReceive('attempt')
             ->once()
             ->with($credentials)
             ->andReturn(false);

        $this->call('POST', 'login', $credentials);

        $this->assertRedirectedToAction(
            '[email protected]', 
            null, 
            ['flash_message']
        );
    }

    /**
     * @test
     */
    public function it_redirects_to_home_page_after_user_logs_in()
    {
        $credentials = [
            'email' => '[email protected]',
            'password' => 'secret',
        ];

        Auth::shouldReceive('attempt')
             ->once()
             ->with($credentials)
             ->andReturn(true);

        $this->call('POST', 'login', $credentials);

        $this->assertRedirectedTo('home');
    }
}

Опять же, всегда думайте о том, что вы действительно хотите проверить. Вам действительно нужно знать, какое действие контроллера запускается на каком маршруте? Или что возвращается имя представления? На самом деле вам просто нужно убедиться, что контроллер фактически пытается это сделать. Вы передаете ему некоторые данные, а затем проверяете, будет ли он вести себя так, как ожидалось.

И всегда убедитесь, что вы не пытаетесь протестировать какие-либо функциональные возможности фреймворка, например, если конкретный маршрут запускает определенное действие или если представление загружено правильно. Это уже проверено, поэтому вам не нужно беспокоиться об этом. Сосредоточьтесь на функциональности вашего приложения, а не на базовой структуре.