Вступление
Laravel предоставляет очень удобный API для выполнения HTTP-запросов к вашему приложению и проверки результатов. Например, взгляните на тест, определенный ниже:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
get
Метод делает GET
запрос в приложение, в то время как assertStatus
метод утверждает , что возвращаемый ответ должен иметь заданный HTTP код статуса. В дополнение к этому простому утверждению, Laravel также содержит множество утверждений для проверки заголовков ответа, содержимого, структуры JSON и многого другого.
Настройка заголовков запросов
Вы можете использовать этот withHeaders
метод для настройки заголовков запроса перед его отправкой в приложение. Это позволяет вам добавлять любые произвольные заголовки, которые вы хотели бы добавить в запрос:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
Промежуточное программное обеспечение CSRF автоматически отключается при запуске тестов.
Отладка ответов
После выполнения тестового запроса к вашему приложению можно использовать методы dump
и dumpHeaders
для проверки и отладки содержимого ответа:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->dumpHeaders();
$response->dump();
}
}
Сессия / Аутентификация
Laravel предоставляет несколько помощников для работы с сеансом во время HTTP-тестирования. Во-первых, вы можете установить данные сеанса для данного массива, используя withSession
метод. Это полезно для загрузки сеанса с данными перед отправкой запроса в ваше приложение:
<?php
class ExampleTest extends TestCase
{
public function testApplication()
{
$response = $this->withSession(['foo' => 'bar'])
->get('/');
}
}
Одним из распространенных применений сеанса является поддержание состояния для аутентифицированного пользователя. actingAs
Вспомогательный метод обеспечивает простой способ для аутентификации данного пользователя в качестве текущего пользователя. Например, мы можем использовать фабрику моделей для генерации и аутентификации пользователя:
<?php
use App\User;
class ExampleTest extends TestCase
{
public function testApplication()
{
$user = factory(User::class)->create();
$response = $this->actingAs($user)
->withSession(['foo' => 'bar'])
->get('/');
}
}
Вы также можете указать, какой сторож следует использовать для аутентификации данного пользователя, передавая имя сторожа в качестве второго аргумента actingAs
метода:
$this->actingAs($user, 'api')
Тестирование API JSON
Laravel также предоставляет несколько помощников для тестирования API-интерфейсов JSON и их ответов. Так , например, json
, get
, post
, put
, patch
, и delete
методы могут быть использованы для выдачи запросов с различными HTTP глаголов. Вы также можете легко передавать данные и заголовки этим методам. Для начала давайте напишем тест, чтобы сделать POST
запрос /user
и подтвердить, что ожидаемые данные были возвращены:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
assertJson
Метод преобразует ответ на массив и использует , чтобы убедиться , что данный массив существует в ответ JSON , возвращаемом приложением. Таким образом, если в ответе JSON есть другие свойства, этот тест будет проходить до тех пор, пока присутствует данный фрагмент.PHPUnit::assertArraySubset
Проверка точного соответствия JSON
Если вы хотите убедиться, что данный массив является точным соответствием для JSON, возвращенного приложением, вы должны использовать assertExactJson
метод:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
Тестирование загрузки файлов
Класс предоставляет метод , который может быть использован для создания фиктивных файлов или изображений для тестирования. Это в сочетании с методом фасада значительно упрощает тестирование загрузки файлов. Например, вы можете объединить эти две функции, чтобы легко протестировать форму загрузки аватара:Illuminate\Http\UploadedFile
fake
Storage
fake
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
public function testAvatarUpload()
{
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->json('POST', '/avatar', [
'avatar' => $file,
]);
// Assert the file was stored...
Storage::disk('avatars')->assertExists($file->hashName());
// Assert a file does not exist...
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}
Поддельные настройки файла
При создании файлов с использованием этого fake
метода вы можете указать ширину, высоту и размер изображения, чтобы лучше проверить свои правила проверки:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
Помимо создания изображений вы можете создавать файлы любого другого типа, используя create
метод:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
Доступные утверждения
Ответные утверждения
Laravel предоставляет множество пользовательских методов подтверждения для ваших тестов PHPUnit . Эти утверждения могут быть доступны на ответ , который возвращается из json
, get
, post
, put
, и delete
методов испытаний:
assertCookieassertCookieExpiredassertCookieNotExpiredassertCookieMissingassertDontSeeassertDontSeeTextassertExactJsonassertForbiddenassertHeaderassertHeaderMissingassertJsonassertJsonCountassertJsonFragmentassertJsonMissingassertJsonMissingExactassertJsonMissingValidationErrorsassertJsonStructureassertJsonValidationErrorsassertLocationassertNotFoundassertOkassertPlainCookieassertRedirectassertSeeassertSeeInOrderassertSeeTextassertSeeTextInOrderassertSessionHasassertSessionHasAllassertSessionHasErrorsassertSessionHasErrorsInassertSessionHasNoErrorsassertSessionDoesntHaveErrorsassertSessionMissingassertStatusassertSuccessfulassertViewHasassertViewHasAllassertViewIsassertViewMissing
assertCookie
Утверждают, что ответ содержит данный файл cookie:
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
Утверждают, что в ответе содержится данный файл cookie, срок его действия истек:
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
Утверждают, что в ответе содержится данный файл cookie, срок его действия не истек:
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
Утверждают, что ответ не содержит данный файл cookie:
$response->assertCookieMissing($cookieName);
assertDontSee
Утверждают, что данная строка не содержится в ответе:
$response->assertDontSee($value);
assertDontSeeText
Утверждают, что данная строка не содержится в тексте ответа:
$response->assertDontSeeText($value);
assertExactJson
Утвердите, что ответ содержит точное соответствие данных JSON:
$response->assertExactJson(array $data);
assertForbidden
Утверждают, что ответ имеет запрещенный код статуса:
$response->assertForbidden();
assertHeader
Утверждают, что данный заголовок присутствует в ответе:
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
Утверждают, что указанный заголовок отсутствует в ответе:
$response->assertHeaderMissing($headerName);
assertJson
Утверждают, что ответ содержит данные JSON:
$response->assertJson(array $data);
assertJsonCount
Утверждают, что ответ JSON имеет массив с ожидаемым количеством элементов в данном ключе:
$response->assertJsonCount($count, $key = null);
assertJsonFragment
Утвердите, что ответ содержит данный фрагмент JSON:
$response->assertJsonFragment(array $data);
assertJsonMissing
Утверждают, что ответ не содержит данный фрагмент JSON:
$response->assertJsonMissing(array $data);
assertJsonMissingExact
Утвердите, что ответ не содержит точный фрагмент JSON:
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
Утвердите, что в ответе нет ошибок проверки JSON для данных ключей:
$response->assertJsonMissingValidationErrors($keys);
assertJsonStructure
Утвердите, что ответ имеет заданную структуру JSON:
$response->assertJsonStructure(array $structure);
assertJsonValidationErrors
Утвердите, что ответ имеет данные ошибки проверки JSON для указанных ключей:
$response->assertJsonValidationErrors($keys);
assertLocation
Утвердите, что ответ имеет указанное значение URI в Location
заголовке:
$response->assertLocation($uri);
assertNotFound
Подтвердите, что ответ имеет не найденный код состояния:
$response->assertNotFound();
assertOk
Утверждают, что ответ имеет 200 кодов статуса:
$response->assertOk();
assertPlainCookie
Утверждают, что в ответе содержится данный файл cookie (незашифрованный):
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
Утверждают, что ответ является перенаправлением на заданный URI:
$response->assertRedirect($uri);
assertSee
Утверждают, что данная строка содержится в ответе:
$response->assertSee($value);
assertSeeInOrder
Утверждают, что указанные строки содержатся в порядке в ответе:
$response->assertSeeInOrder(array $values);
assertSeeText
Утверждают, что данная строка содержится в тексте ответа:
$response->assertSeeText($value);
assertSeeTextInOrder
Утверждают, что указанные строки содержатся в порядке в тексте ответа:
$response->assertSeeTextInOrder(array $values);
assertSessionHas
Утверждают, что сессия содержит данный фрагмент данных:
$response->assertSessionHas($key, $value = null);
assertSessionHasAll
Утверждают, что у сеанса есть заданный список значений:
$response->assertSessionHasAll(array $data);
assertSessionHasErrors
Утверждают, что сеанс содержит ошибку для данного поля:
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSessionHasErrorsIn
Утверждают, что сессия имеет указанные ошибки:
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
Утверждают, что в сеансе нет ошибок:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
Утверждают, что в сеансе нет ошибок для данных ключей:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionMissing
Утверждают, что сеанс не содержит данный ключ:
$response->assertSessionMissing($key);
assertStatus
Утверждают, что ответ имеет заданный код:
$response->assertStatus($code);
assertSuccessful
Подтвердите, что ответ имеет успешный код состояния:
$response->assertSuccessful();
assertViewHas
Утверждают, что представлению ответа был предоставлен фрагмент данных:
$response->assertViewHas($key, $value = null);
assertViewHasAll
Утвердите, что представление ответа имеет заданный список данных:
$response->assertViewHasAll(array $data);
assertViewIs
Утверждают, что данный вид был возвращен по маршруту:
$response->assertViewIs($value);
assertViewMissing
Утвердите, что в представлении ответа отсутствует часть связанных данных:
$response->assertViewMissing($key);
Утверждения аутентификации
Laravel также предоставляет различные проверки подлинности для ваших тестов PHPUnit :
метод | Описание |
---|---|
$this->assertAuthenticated($guard = null); |
Утверждают, что пользователь аутентифицирован. |
$this->assertGuest($guard = null); |
Утверждают, что пользователь не аутентифицирован. |
$this->assertAuthenticatedAs($user, $guard = null); |
Утверждают, что данный пользователь аутентифицирован. |
$this->assertCredentials(array $credentials, $guard = null); |
Утверждают, что данные учетные данные действительны. |
$this->assertInvalidCredentials(array $credentials, $guard = null); |
Утверждают, что данные учетные данные являются недействительными. |
0 комментариев