Введение
Laravel построен с учётом тестирования. Фактически, поддержка PHPUnit доступна по умолчанию, а файл phpunit.xml уже настроен для вашего приложения. В дополнение к PHPUnit Laravel также использует компоненты Symfony HttpKernel, DomCrawler и BrowserKit для проверки и манипулирования шаблонами для симуляции работы браузера.
Папка app/tests уже содержит файл теста для примера. После установки нового приложения Laravel просто выполните команду phpunit для запуска процесса тестирования.
Определение тестов для выполнения
Для создания теста просто создайте новый файл в папке app/tests. Класс теста должен наследовать класс PHPTestCase
. Вы можете объявлять методы тестов как вы обычно объявляете их для PHPUnit.
class FooTest extends TestCase {
public function testSomethingIsTrue()
{
$this->assertTrue(true);
}
}
Вы можете запустить все тесты в вашем приложении через командную строку командой phpunit.
Внимание: если вы определили собственный метод PHPsetUp()
, не забудьте вызвать PHPparent::setUp()
.
Тестовое окружение
Во время выполнения тестов Laravel автоматически установит текущую среду в testing. Кроме этого Laravel подключит настройки тестовой среды для сессии и кэширования. Оба эти драйвера устанавливаются в array, что позволяет данным существовать в памяти, пока работают тесты. Вы можете свободно создать любое другое тестовое окружение по необходимости.
Обращение к маршрутам
Вызов маршрута из теста
Вы можете легко вызвать любой ваш маршрут методом PHPcall()
:
$response = $this->call('GET', 'user/profile');
$response = $this->call($method, $uri, $parameters, $files, $server, $content);
После этого вы можете обращаться к свойствам объекта PHPIlluminate\Http\Response
:
$this->assertEquals('Hello World', $response->getContent());
Вызов контроллера из теста
Вы также можете вызвать из теста любой контроллер:
$response = $this->action('GET', 'HomeController@index');
$response = $this->action('GET', 'UserController@profile', array('user' => 1));
Метод PHPgetContent()
вернёт содержимое-строку ответа маршрута или контроллера. Если был возвращён PHPView
, вы можете получить его через свойство PHP$original
:
$view = $response->original;
$this->assertEquals('John', $view['name']);
Для вызова HTTPS-маршрута можно использовать метод PHPcallSecure()
:
$response = $this->callSecure('GET', 'foo/bar');
Внимание: фильтры маршрутов отключены в тестовой среде. Для их включения добавьте в тест вызов PHPRoute::enableFilters()
.
DomCrawler
Вы можете вызвать ваш маршрут и получить объект PHPDomCrawler
, который может использоваться для проверки содержимого ответа:
$crawler = $this->client->request('GET', '/');
$this->assertTrue($this->client->getResponse()->isOk());
$this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));
Для более подробной информации о его использовании обратитесь к официальной документации.
Тестирование фасадов
При тестировании вам может потребоваться отловить вызов к одному из статических классов-фасадов Laravel. К примеру, у вас есть такой контроллер:
public function getIndex()
{
Event::fire('foo', array('name' => 'Дейл'));
return 'All done!';
}
Вы можете отловить обращение к PHPEvent
с помощью метода PHPshouldReceive()
этого фасада, который вернёт объект Mockery.
public function testGetIndex()
{
Event::shouldReceive('fire')->once()->with('foo', array('name' => 'Дейл'));
$this->call('GET', '/');
}
Внимание: не делайте этого для объекта PHPRequest
. Вместо этого, передайте желаемый ввод методу PHPcall()
во время выполнения вашего теста.
Проверки (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);
}
добавлено в 4.1 ()
Проверка наличия ошибок в сессии
public function testMethod()
{
$this->call('GET', '/');
$this->assertSessionHasErrors();
// Проверка наличия в сессии ошибок по заданному значению...
$this->assertSessionHasErrors('name');
// Проверка наличия в сессии ошибок по нескольким значениям...
$this->assertSessionHasErrors(array('name', 'age'));
}
Проверка наличия данных в старом вводе
public function testMethod()
{
$this->call('GET', '/');
$this->assertHasOldInput();
}
Вспомогательные методы
Класс PHPTestCase
содержит несколько вспомогательных методов для упрощения тестирования вашего приложения.
добавлено в 4.1 ()
Установка текущего авторизованного пользователя
Вы можете установить текущего авторизованного пользователя с помощью метода PHPbe()
:
$user = new User(array('name' => 'John'));
$this->be($user);
Вы можете заполнить вашу БД начальными данными изнутри теста методом PHPseed()
.
Заполнение БД тестовыми данными
$this->seed();
$this->seed($connection);
Больше информации на тему начальных данных доступно в разделе о миграциях.
добавлено в 4.1 ()
Обновление приложения
Как вы уже знаете, вы можете получить доступ к Laravel Application/IoC-контейнеру с помощью PHP$this->app
из любого тестового метода. Этот экземпляр приложения обновляется для каждого тестового класса. Если вы хотите вручную обновить приложение для определённого метода, вы можете использовать метод PHPrefreshApplication()
из этого тестового метода. Это приведет к сбросу дополнительных привязок, таких как заглушки, которые были помещены в IoC-контейнер после запуска теста.