Тестирование
12.x.
Почему это важно?
Введение
Laravel построен с учётом того, что современная профессиональная разработка немыслима без юнит-тестирования. Поддержка PHPUnit доступна “из коробки”, а файл phpunit.xml уже настроен для вашего приложения. В дополнение к PHPUnit Laravel также использует компоненты Symfony HttpKernel, DomCrawler и BrowserKit для тестирования ваших шаблонов при помощи эмуляции браузера.
Папка app/tests уже содержит файл теста для примера. После установки нового приложения Laravel просто выполните команду phpunit для запуска процесса тестирования.
Написание и запуск тестов
Для создания теста просто создайте новый файл в папке app/tests. Класс теста должен наследовать класс TestCase. Вы можете объявлять методы тестов как вы обычно объявляете их для PHPUnit.
Пример тестового класса
class FooTest extends TestCase {
public function testSomethingIsTrue()
{
$this->assertTrue(true);
}
}
Вы можете запустить все тесты в вашем приложении командой phpunit в терминале.
Примечание: если вы определили собственный метод
setUp, не забудьте вызватьparent::setUp.
Тестовое окружение
Во время выполнения тестов Laravel автоматически установит текущую среду в testing. Кроме этого Laravel подключит настройки тестовой среды для сессии (session) и кэширования (cache). Оба эти драйвера устанавливаются в array, что позволяет данным существовать в памяти, пока работают тесты. Вы можете свободно создать любое другое тестовое окружение по необходимости.
Обращение к URL
Вызов URL из теста
Вы можете легко вызвать любой ваш URL методом 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());
Вызов контроллера из теста
Вы также можете вызвать из теста любой контроллер.
$response = $this->action('GET', 'HomeController@index');
$response = $this->action('GET', 'UserController@profile', array('user' => 1));
Метод getContent вернёт содержимое-строку ответа роута или контроллера. Если был возвращён View вы можете получить его через свойство original:
$view = $response->original;
$this->assertEquals('John', $view['name']);
Для вызова HTTPS-маршрута можно использовать метод callSecure:
$response = $this->callSecure('GET', 'foo/bar');
Примечание: фильтры роутов отключены в тестовой среде. Для их включения добавьте в тест вызов
Route::enableFilters().
Работа с DOM
Вы можете обратиться к URL и получить объект DomCrawler, который может использоваться для проверки содержимого ответа:
$crawler = $this->client->request('GET', '/');
$this->assertTrue($this->client->getResponse()->isOk());
$this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));
Для более подробной информации о его использовании обратитесь к официальной документации.
Тестирование фасадов
При тестировании вам может потребоваться отловить вызов (mock a call) к одному из статических классов-фасадов Laravel. К примеру, у вас есть такой контроллер:
public function getIndex()
{
Event::fire('foo', array('name' => 'Дейл'));
return 'All done!';
}
Вы можете отловить обращение к Event с помощью метода shouldReceive этого фасада, который вернёт объект Mockery.
Мок (mocking) фасада Event
public function testGetIndex()
{
Event::shouldReceive('fire')->once()->with(array('name' => 'Дейл'));
$this->call('GET', '/');
}
Примечание: не делайте этого для объекта
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);
}
Проверка на наличие ошибок в сессии
public function testMethod()
{
$this->call('GET', '/');
$this->assertSessionHasErrors();
// Asserting the session has errors for a given key...
$this->assertSessionHasErrors('name');
// Asserting the session has errors for several keys...
$this->assertSessionHasErrors(array('name', 'age'));
}
Проверка на наличие "старого пользовательского ввода"
public function testMethod()
{
$this->call('GET', '/');
$this->assertHasOldInput();
}
Вспомогательные методы
Класс TestCase содержит несколько вспомогательных методов для упрощения тестирования вашего приложения.
Установка текущего авторизованного пользователя
Вы можете установить текущего авторизованного пользователя с помощью метода be:
$user = new User(array('name' => 'John'));
$this->be($user);
Вы можете заполнить вашу БД начальными данными изнутри теста методом seed.
**Заполнение БД тестовыми данными
$this->seed();
$this->seed($connection);
Больше информации на тему начальных данных доступно в разделе Миграции и начальные данные.
Ресет IoC-контейнера Laravel
Как вы уже знаете, в любой части теста вы можете получить доступ к IoC-контейнеру приложения Laravel при помощи $this->app. Объект приложения Laravel обновляется для каждого тестового класса, но не метода. Если вы хотите вручную ресетить объект приложения Laravel в произвольном месте, вы можете это сделать при помощи метода refreshApplication. Это сбросит все моки (mock) и другие дополнительные биндинги, которые были сделаны с момента запуска тест-сессии.