Версия фреймворка: 5.4 4.2 4.1

Юнит-тесты

Введение

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) и другие дополнительные биндинги, которые были сделаны с момента запуска тест-сессии.