git ad5b81b4eaf67795c3a6335ca73a6542d121bf27
- Введение
- Написание и запуск тестов
- Тестовое окружение
- Обращение к URL
- Тестирование фасадов
- Проверки (assertions)
- Вспомогательные методы
- Ресет IoC-контейнера Laravel
Laravel построен с учётом того, что современная профессиональная разработка немыслима без юнит-тестирования. Поддержка PHPUnit доступна "из коробки", а файл phpunit.xml
уже настроен для вашего приложения.
Папка tests
уже содержит файл теста для примера. После установки нового приложения Laravel просто выполните команду phpunit
для запуска процесса тестирования.
Для создания теста просто создайте новый файл в папке tests
. Класс теста должен наследовать класс TestCase
. Вы можете объявлять методы тестов как вы обычно объявляете их для PHPUnit.
class FooTest extends TestCase {
public function testSomethingIsTrue()
{
$this->assertTrue(true);
}
}
Вы можете запустить все тесты в вашем приложении командой phpunit
в терминале.
Примечание: если вы определили собственный метод
setUp
, не забудьте вызватьparent::setUp
.
Во время выполнения тестов Laravel автоматически установит текущую среду в testing
. Кроме этого Laravel подключит настройки тестовой среды для сессии (session
) и кэширования (cache
). Оба эти драйвера устанавливаются в array
, что позволяет данным существовать в памяти, пока работают тесты. Вы можете свободно создать любое другое тестовое окружение по необходимости.
Вы можете легко вызвать любой ваш 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));
Примечание: Нет необходимости указывать полный неймспейс в методе
action
-App\Http\Controllers
можно опустить.
Метод getContent
вернёт содержимое-строку ответа роута или контроллера. Если был возвращён View
вы можете получить его через свойство original
:
$view = $response->original;
$this->assertEquals('John', $view['name']);
Для вызова HTTPS-маршрута можно использовать метод callSecure
:
$response = $this->callSecure('GET', 'foo/bar');
При тестировании вам может потребоваться отловить вызов (mock a call) к одному из статических классов-фасадов Laravel. К примеру, у вас есть такой контроллер:
public function getIndex()
{
Event::fire('foo', ['name' => 'Дейл']);
return 'All done!';
}
Вы можете отловить обращение к Event
с помощью метода shouldReceive
этого фасада, который вернёт объект Mockery.
public function testGetIndex()
{
Event::shouldReceive('fire')->once()->with(['name' => 'Дейл']);
$this->call('GET', '/');
}
Примечание: не делайте этого для объекта
Request
. Вместо этого передайте желаемый ввод методуcall
во время выполнения вашего теста.
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 при помощи $this->app
. Объект приложения Laravel обновляется для каждого тестового класса, но не метода. Если вы хотите вручную ресетить объект приложения Laravel в произвольном месте, вы можете это сделать при помощи метода refreshApplication
. Это сбросит все моки (mock) и другие дополнительные биндинги, которые были сделаны с момента запуска тест-сессии.