{{TOC}} {{DOCVER 4.0=0da300f6445bec5a70d007f503834fce957b065b 16.10.2014 5:19:26, 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03, 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15}} == Введение == Laravel построен с учётом тестирования. Фактически, поддержка ((http://phpunit.de PHPUnit)) доступна по умолчанию, а файл %%(t)phpunit.xml%% уже настроен для вашего приложения. В дополнение к PHPUnit Laravel также использует компоненты //Symfony HttpKernel//, //DomCrawler// и //BrowserKit// для проверки и манипулирования ((docs/v4/templates шаблонами)) для симуляции работы браузера. Папка %%(t)app/tests%% уже содержит файл теста для примера. После установки нового приложения Laravel просто выполните команду **phpunit** для запуска процесса тестирования. == Определение тестов для выполнения == Для создания теста просто создайте новый файл в папке %%(t)app/tests%%. Класс теста должен наследовать класс %%TestCase%%. Вы можете объявлять методы тестов как вы обычно объявляете их для PHPUnit. **Пример тестового класса** %% class FooTest extends TestCase { public function testSomethingIsTrue() { $this->assertTrue(true); } } %% Вы можете запустить все тесты в вашем приложении через командную строку командой **phpunit**. .(alert) **Внимание:** если вы определили собственный метод %%setUp()%%, не забудьте вызвать %%parent::setUp()%%. == Тестовое окружение == Во время выполнения тестов Laravel автоматически установит текущую ((docs/v4/configuration#сред+а))у в %%(t)testing%%. Кроме этого Laravel подключит настройки тестовой среды для ((docs/v4/session сессии)) и ((docs/v4/cache кэширования)). Оба эти драйвера устанавливаются в %%(t)array%%, что позволяет данным существовать в памяти, пока работают тесты. Вы можете свободно создать любое другое тестовое окружение по необходимости. == Обращение к маршрутам == **Вызов ((docs/v4/routing маршрута)) из теста** Вы можете легко вызвать любой ваш маршрут методом %%call()%%: %% $response = $this->call('GET', 'user/profile'); $response = $this->call($method, $uri, $parameters, $files, $server, $content); %% После этого вы можете обращаться к свойствам объекта %%Illuminate\Http\Response%%: %% $this->assertEquals('Hello World', $response->getContent()); %% **Вызов ((docs/v4/controllers контроллера)) из теста** Вы также можете вызвать из теста любой контроллер: %% $response = $this->action('GET', 'HomeController@index'); $response = $this->action('GET', 'UserController@profile', array('user' => 1)); %% Метод %%getContent()%% вернёт содержимое-строку ответа маршрута или контроллера. Если был возвращён ((docs/v4/templates %%View%%)), вы можете получить его через свойство %%$original%%: %% $view = $response->original; $this->assertEquals('John', $view['name']); %% Для вызова HTTPS-маршрута можно использовать метод %%callSecure()%%: %% $response = $this->callSecure('GET', 'foo/bar'); %% .(alert) **Внимание:** фильтры маршрутов отключены в тестовой среде. Для их включения добавьте в тест вызов %%Route::enableFilters()%%. == DomCrawler == Вы можете вызвать ваш ((docs/v4/routing маршрут)) и получить объект %%DomCrawler%%, который может использоваться для проверки содержимого ответа: %% $crawler = $this->client->request('GET', '/'); $this->assertTrue($this->client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('h1:contains("Hello World!")')); %% Для более подробной информации о его использовании обратитесь к ((http://symfony.com/doc/master/components/dom_crawler.html официальной документации)). == Тестирование фасадов == При тестировании вам может потребоваться отловить вызов к одному из статических ((docs/v4/facades классов-фасадов)) Laravel. К примеру, у вас есть такой ((docs/v4/controllers контроллер)): %% public function getIndex() { Event::fire('foo', array('name' => 'Дейл')); return 'All done!'; } %% Вы можете отловить обращение к %%Event%% с помощью метода %%shouldReceive()%% этого фасада, который вернёт объект ((https://github.com/padraic/mockery Mockery)). **Тестирование фасада %%Event%%** %% public function testGetIndex() { Event::shouldReceive('fire')->once()->with('foo', array('name' => 'Дейл')); $this->call('GET', '/'); } %% .(alert) **Внимание:** не делайте этого для объекта %%Request%%. Вместо этого, передайте желаемый ввод методу %%call()%% во время выполнения вашего теста. == Проверки (//assertions//) == Laravel предоставляет несколько //assert//-методов, чтобы сделать ваши тесты немного проще. **Проверка на успешный запрос** %% public function testMethod() { $this->call('GET', '/'); $this->assertResponseOk(); } %% **Проверка статуса ответа** %% $this->assertResponseStatus(403); %% **Проверка переадресации в ответе** %% $this->assertRedirectedTo('foo'); $this->assertRedirectedToRoute('route.name'); $this->assertRedirectedToAction('Controller@method'); %% **Проверка наличия данных в шаблоне** %% public function testMethod() { $this->call('GET', '/'); $this->assertViewHas('name'); $this->assertViewHas('age', $value); } %% **Проверка наличия данных в сессии** %% public function testMethod() { $this->call('GET', '/'); $this->assertSessionHas('name'); $this->assertSessionHas('age', $value); } %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) **Проверка наличия ошибок в сессии** ~%% public function testMethod() { $this->call('GET', '/'); $this->assertSessionHasErrors(); // Проверка наличия в сессии ошибок по заданному значению... $this->assertSessionHasErrors('name'); // Проверка наличия в сессии ошибок по нескольким значениям... $this->assertSessionHasErrors(array('name', 'age')); } ~%% **Проверка наличия данных в старом вводе** ~%% public function testMethod() { $this->call('GET', '/'); $this->assertHasOldInput(); } ~%% %% == Вспомогательные методы == Класс %%TestCase%% содержит несколько вспомогательных методов для упрощения тестирования вашего приложения. %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) **Установка и очистка сессий из теста** ~%% $this->session(['foo' => 'bar']); $this->flushSession(); ~%% %% **Установка текущего авторизованного пользователя** Вы можете установить текущего авторизованного пользователя с помощью метода %%be()%%: %% $user = new User(array('name' => 'John')); $this->be($user); %% Вы можете заполнить вашу БД начальными данными изнутри теста методом %%seed()%%. **Заполнение БД тестовыми данными** %% $this->seed(); $this->seed($connection); %% Больше информации на тему начальных данных доступно в ((docs/v4/migrations#начальные разделе о миграциях)). %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) ==Обновление приложения== Как вы уже знаете, вы можете получить доступ к Laravel %%(t)Application%%/IoC-контейнеру с помощью %%$this->app%% из любого тестового метода. Этот экземпляр приложения обновляется для каждого тестового класса. Если вы хотите вручную обновить приложение для определённого метода, вы можете использовать метод %%refreshApplication()%% из этого тестового метода. Это приведет к сбросу дополнительных привязок, таких как заглушки, которые были помещены в IoC-контейнер после запуска теста. %%