Test HTTP
Tests HTTP
- Introduction
- Session/Authentification
- Test des API JSON
- Test du téléchargement de fichiers
- Méthodes d'assertion disponibles
Introduction
Laravel fournit une API très fluide pour la génération de requêtes HTTP et l'inspection de la sortie. Par exemple, vous pouvez consulter ce cas de test ci-dessous :
<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; class ExampleTest extends TestCase{ /** * 一个基础的测试用例。 * * @return void */ public function testBasicTest() { $response = $this->get('/'); $response->assertStatus(200); } }
La méthode get
crée une requête GET
pour votre application, et la méthode assertStatus
La méthode affirme que la réponse renvoyée est le code d'état HTTP spécifié. En plus de cette simple assertion, Laravel inclut également diverses assertions qui vérifient les en-têtes de réponse, le contenu, le JSON, la structure, etc. get
方法会创建一个 GET
请求来请求你的应用,而 assertStatus
方法断言返回的响应是指定的 HTTP 状态码。 除了这个简单的断言之外, Laravel 也包含检查响应标头、内容、JSON、结构等各种断言。
自定义请求头
你可以使用 withHeaders
方法在发送到应用程式之前自定义请求的标头。 你可以添加想要的任何自定义标头。
<?php class ExampleTest extends TestCase{ /** * 一个基础的功能测试用例。 * * @return void */ public function testBasicExample() { $response = $this->withHeaders([ 'X-Header' => 'Value', ])->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertJson([ 'created' => true, ]); } }
{tip} 运行测试时,CSRF 中间件会自动禁用。
Session / 认证
Laravel 提供了几个可在 HTTP 测试时使用 Session 的辅助函数。首先,你需要传递一个数组给 withSession
方法来设置 Session 数据。这让你在应用程序的测试请求发送之前,先给数据加载 Session 变得简单:
<?php class ExampleTest extends TestCase{ public function testApplication() { $response = $this->withSession(['foo' => 'bar']) ->get('/'); } }
当然,一般使用 Session 时都是用于维护用户状态,如认证用户。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')
测试 JSON APIs
Laravel 也提供了几个辅助函数来测试 JSON APIs 和他们的响应。 例如,json
, get
, post
, put
, patch
,和 delete
可以被用于发送各种 HTTP 动作。 你也可以轻松地将数据和请求头传递到这些方法中。让我们写一个 POST
请求到 /user
并断言返回期望的数据来开始使用他们:
<?php class ExampleTest extends TestCase{ /** * 一个简单的功能测试用例。 * * @return void */ public function testBasicExample() { $response = $this->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertJson([ 'created' => true, ]); } }
{tip}
assertJson
方法将响应转换为数组并利用PHPUnit::assertArraySubset
来验证给定的数组存在于应用返回的 JSON 响应中。 所以,如果 JSON 响应中有其他属性,测试仍旧会在给定数组存在的情况下通过:
验证完全匹配
如果你想验证给定的数组 完全 匹配应用返回的 JSON 结果,你应该使用 assertExactJson
在使用 除创建图像外,你也可以用 Lors de l'utilisation du < code>fake pour créer un fichier, vous pouvez spécifier la largeur, la hauteur et la taille de l'image pour mieux vérifier les règles de test : Laravel fournit une variété de méthodes d'assertion courantes pour les tests PHPUnit. Ces assertions sont accessibles depuis la assertCookie Assert que la réponse contient le cookie donné et qu'il a expiré : Assert que la réponse contient le cookie donné et qu'il n'a pas expiré : Assert que la réponse a l'erreur de validation JSON donnée pour la clé donnée : Assert que la réponse a la valeur URI donnée dans l'en-tête La réponse d'assertion n'a pas trouvé le code d'état : La réponse d'assertion a le code d'état : affirme que la réponse contient le cookie donné (non chiffré) : Assert que la réponse redirige vers l'URI donné Ass ert que la chaîne donnée est contenu dans la réponse Medium : Assert que la chaîne donnée est contenue dans le texte de la réponse : Assert that la chaîne donnée est contenue dans le texte de réponse : Assert que la chaîne donnée est contenue dans le texte de réponse dans l'ordre : Affirmer que la session est contenue Données données : Assert que la session contient une liste de valeurs donnée Affirmer que la session contient une erreur pour un champ donné : Assert que la session contient les erreurs indiquées : Assert que la session a aucune erreur : Assert que la session n'a pas la clé donnée : Assert que la session ne contient pas la clé donnée : Assert que la réponse a le code d'état donné : Assert que la réponse a le code d'état de réussite Assert réponse view est une donnée donnée : Affirmer que la vue de réponse contient la liste de données donnée Ass ert route renvoie la vue donnée : Assert qu'il manque une donnée de liaison à la vue de réponse : Laravel également vous fournit PHPUnit Testing fournit divers liés à l'authentification Affirmation de : Personnalisation des en-têtes de requête
Vous pouvez utiliser Le withHeaders
personnalise les en-têtes de la requête avant de l'envoyer à l'application. Vous pouvez ajouter tous les en-têtes personnalisés de votre choix. <?php
class ExampleTest extends TestCase{
/**
* 一个基本的功能测试用例。
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
withSession
pour définir les données de session. Cela vous permet de charger facilement la session avec des données avant d'envoyer la demande de test de l'application : 🎜<?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,
]);
// 断言文件已经存储 . . .
Storage::disk('avatars')->assertExists($file->hashName());
// 断言文件不存在 . . .
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}
🎜 Bien sûr, la session est généralement utilisée pour maintenir le statut de l'utilisateur, comme l'authentification des utilisateurs. La fonction d'assistance actingAs
fournit un moyen simple de spécifier un utilisateur auprès duquel s'authentifier en tant qu'utilisateur actuel. Par exemple, nous pouvons utiliser le modèle d'usine pour générer et authentifier les utilisateurs : 🎜UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
🎜Vous pouvez également spécifier par quel observateur l'utilisateur est authentifié en passant le nom de l'observateur comme deuxième paramètre de actingAs
: 🎜UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
🎜🎜🎜json
, get
, post
, put
, patch
et < code >delete peut être utilisé pour envoyer diverses actions HTTP. Vous pouvez également facilement transmettre des données et des en-têtes de requête à ces méthodes. Commençons par les utiliser en écrivant une requête POST
à /user
et en affirmant les données attendues : 🎜$response->assertCookie($cookieName, $value = null);
🎜{tip}
🎜🎜🎜assertJson
La méthode convertit la réponse en tableau et utilise PHPUnit::assertArraySubset
pour vérifier que le tableau donné est présent dans la réponse JSON renvoyée par l'application. Ainsi, s'il y a d'autres attributs dans la réponse JSON, le test réussira quand même compte tenu de la présence du tableau : 🎜Vérifier la correspondance exacte
🎜Si vous souhaitez vérifier qu'un tableau donné correspond exactement au résultat JSON renvoyé par votre application, vous devez utiliser Méthode assertExactJson
: 🎜$response->assertCookieExpired($cookieName);
🎜🎜🎜🎜🎜🎜Téléchargement de fichiers de test
IlluminateHttpUploadedFile
fournit une méthode fausse
pour générer des fichiers ou des images virtuels à des fins de test. Il peut être combiné avec la méthode fake
de la façade Storage
pour simplifier considérablement les tests de téléchargement de fichiers. Par exemple, vous pouvez combiner les deux fonctions pour tester facilement le formulaire de téléchargement d'avatar : IlluminateHttpUploadedFile
提供了一个 fake
方法用于生成虚拟的文件或者图像以供测试之用。 它可以和 Storage
facade 的 fake
方法相结合, 大幅度简化了文件上传测试。举个例子,你可以结合这两者的功能非常方便地进行头像上传表单测试:$response->assertCookieNotExpired($cookieName);
虚拟文件制定
fake
方法创建文件时,你可以指定图像的宽高以及大小,从而更好的验证测试规则:$response->assertCookieMissing($cookieName);
create
$response->assertDontSee($value);
Formulation de fichier virtuel
$response->assertDontSeeText($value);
En plus de créer des images, vous pouvez également utiliser create< /code> méthode pour créer d'autres types de fichiers :
$response->assertExactJson(array $data);
🎜🎜🎜🎜Response Assertion
json
, get
, post
, put
,和 delete
méthode de test :
assertCookieExpired
assertCookieNotExpired
assertCookieMissing
assertDontSee
asser tDontSeeText
assertExactJson
assertForbidden
assertHeader
assertHeaderMissing
assertJson
assertJsonCount
assertJsonFragment
assertJsonMissing
assertJsonMissingExact
assertJ sonMissingValidationErrors
assertJsonStructure
assertJsonValidationErrors
assertLocation
assertNotFound
assertOk
assertPlainCookie
assertRedirect
assertSee
assertSeeInOrder
assertSeeText
assertSeeTextInOrder
assertSessionHas
assertSes sionHasTous
assertStatus
assertSuccessful
assertViewHas
assertViewHasAll
assertViewIs
assertViewMissing
assertCookie
Assert que le cookie donné est inclus dans la réponse : $response->assertForbidden();
assertCookieExpired
$response->assertHeader($headerName, $value = null);
assertCookieNotExpired
assertDontSeeAssert que la chaîne donnée n'est pas incluse dans la réponse : $response->assertHeaderMissing($headerName);
assertDontSeeText$response->assertJson(array $data);
assertExactJsonAssert que les données contenues dans la réponse correspondent exactement aux données JSON données : $response->assertJsonCount($count, $key = null);
assertForbidden Assert que la réponse a le code d'état interdit : $response->assertJsonFragment(array $data);
assertHeaderAssert que la réponse a l'en-tête donné : $response->assertJsonMissing(array $data);
$response->assertJsonMissingExact(array $data);
assertJson Affirmer que la réponse contient les données JSON données : $response->assertJsonMissingValidationErrors($keys);
assertJsonCount$response->assertJsonStructure(array $structure);
assertJsonFragment Affirmer que la réponse ne contient pas l'extrait JSON donné : $response->assertJsonValidationErrors($keys);
assert JsonMissingExactAssert que la réponse ne contient pas le fragment JSON exact : $response->assertLocation($uri);
assertJsonMissingValidationErrorsAssert que la réponse ne contient pas de JSON pour la clé donnée Erreurs de validation : $response->assertNotFound();
assertJsonStructure$response->assertOk();
$response->assertPlainCookie($cookieName, $value = null);
assertJsonValidationErrors
$response->assertRedirect($uri);
assertLocation
Location
: $response->assertSee($value);
assertNotFound
$response->assertSeeInOrder(array $values);
assertOk
$response->assertSeeText($value);
asser tPlainCookie
$response->assertSeeTextInOrder(array $values);
assertRedirect
$response->assertSessionHas($key, $value = null);
assertSee
$response->assertSessionHasAll(array $data);
assertSeeInOrder
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSeeText
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSeeTextInOrder
$response->assertSessionHasNoErrors();
assertSessionHas
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionHasAll
$response->assertSessionMissing($key);
assertSessionHasErrors
$response->assertStatus($code);
assertSessionHasErrorsIn
$response->assertSuccessful();
assertSessionHasNoErrors
$response->assertViewHas($key, $value = null);
assertSessionDoesntHaveErrors
$response->assertViewHasAll(array $data);
assertSessionMissing
$response->assertViewIs($value);
assertStatus
$response->assertViewMissing($key);
assertSuccessful
assertViewHas
assertViewHasAll
assertViewIs
assertViewMissing
Authentication Assertions
Method Description $this->assertAuthenticated($guard = null);
$this->assertAuthenticated($guard = null);
断言此用户已被认证。 $this->assertGuest($guard = null);
断言此用户未被认证。 $this->assertAuthenticatedAs($user, $guard = null);
断言给定的用户被认证。 $this->assertCredentials(array $credentials, $guard = null);
断言给定的凭证有效。 Assert que cet utilisateur a été authentifié. $this->assertInvalidCredentials(array $credentials, $guard = null);
$this->assertGuest($guard = null);
$this->assertAuthenticatedAs($user, $guard = null);
🎜🎜Afficher que l'utilisateur donné est authentifié. 🎜🎜🎜🎜$this->assertCredentials(array $credentials, $guard = null);
🎜🎜Attendre que les informations d'identification données sont valides. 🎜🎜🎜🎜$this->assertInvalidCredentials(array $credentials, $guard = null);
🎜🎜Afficher que les informations d'identification fournies ne sont pas valides. 🎜🎜🎜🎜🎜Cet article a été publié pour la première fois sur le site 🎜LearnKu.com🎜. 🎜🎜