Я пытаюсь запустить новое приложение Laravel после TDD
Мой первый шаг – проверить, что контроллер / login вызывается на домашнем URL-адресе.
Несмотря на следующие несколько уроков, я не могу заставить тест работать, и я не вижу, что я делаю неправильно.
Моя настройка: композитор для установки laravel composer для установки phpunit
вот мой маршрут:
<?php Route::get('/login', 'AuthenticationController@login');
мой контроллер:
<?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', 'AuthenticationController@login'); $view = $response->original; $this->assertEquals('authentication.login', $view['name']); } }
Ошибка, которую я получаю
ErrorException: Undefined index: name
Код как копия (в точности точно) с сайта Laravel, но он не запускается.
Может ли кто-нибудь увидеть, что я делаю неправильно?
Он утверждает, что $ view не имеет имени индекса, но это не может быть правильным, как его пример на веб-сайте laravel, плюс представление отображается с использованием его имени (оно также верно отображается на лицевой части)
РЕДАКТИРОВАТЬ::
Таким образом, из комментария, что фрагментарный блок тестирования laravel не ясен и что $ view ['name'] проверяет переменную с именем $ name. Если это так, как вы тестируете используемый контроллер / маршрут, IE. какое имя контроллера / имя действия использовалось для маршрута ('X')
Хорошо, как уже было немного объяснено в комментариях, давайте сначала сделаем шаг назад и подумаем о сценарии.
«Мой первый шаг – проверить, что контроллер / 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( 'AuthenticationController@login', 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 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( 'AuthenticationController@login', 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' => 'test@test.com', 'password' => 'secret', ]; Auth::shouldReceive('attempt') ->once() ->with($credentials) ->andReturn(false); $this->call('POST', 'login', $credentials); $this->assertRedirectedToAction( 'AuthenticationController@login', null, ['flash_message'] ); } /** * @test */ public function it_redirects_to_home_page_after_user_logs_in() { $credentials = [ 'email' => 'test@test.com', 'password' => 'secret', ]; Auth::shouldReceive('attempt') ->once() ->with($credentials) ->andReturn(true); $this->call('POST', 'login', $credentials); $this->assertRedirectedTo('home'); } }
в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' => 'test@test.com', 'password' => 'secret', ]; Auth::shouldReceive('attempt') ->once() ->with($credentials) ->andReturn(false); $this->call('POST', 'login', $credentials); $this->assertRedirectedToAction( 'AuthenticationController@login', null, ['flash_message'] ); } /** * @test */ public function it_redirects_to_home_page_after_user_logs_in() { $credentials = [ 'email' => 'test@test.com', 'password' => 'secret', ]; Auth::shouldReceive('attempt') ->once() ->with($credentials) ->andReturn(true); $this->call('POST', 'login', $credentials); $this->assertRedirectedTo('home'); } }
Опять же, всегда думайте о том, что вы действительно хотите проверить. Вам действительно нужно знать, какое действие контроллера запускается на каком маршруте? Или что возвращается имя представления? На самом деле вам просто нужно убедиться, что контроллер фактически пытается это сделать. Вы передаете ему некоторые данные, а затем проверяете, ведет ли он себя так, как ожидалось.
И всегда убедитесь, что вы не пытаетесь протестировать какие-либо функциональные возможности фреймворка, например, если конкретный маршрут запускает определенное действие или если представление загружено правильно. Это уже проверено, поэтому вам не нужно беспокоиться об этом. Сосредоточьтесь на функциональности вашего приложения, а не на базовой структуре.