Любите загадки? Событие всё ещё доступно на сайте

Тестирование

Вы просматриваете документ для прошлой версии.
Рассмотрите возможность обновления вашего проекта до актуальной версии 13.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) и другие дополнительные биндинги, которые были сделаны с момента запуска тест-сессии.