Test HTTP


Tests HTTP

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, getpostputpatch,和 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

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,           
                  ]);  
         }
     }
{tip} Le middleware CSRF est automatiquement désactivé lors de l'exécution des tests. 🎜🎜🎜🎜
🎜🎜Session / Authentification 🎜🎜Laravel propose plusieurs options qui peuvent être utilisées dans HTTP Utilisez les fonctions d'assistance de Session lors des tests. Tout d'abord, vous devez transmettre un tableau à la méthode 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);
🎜
🎜🎜
🎜🎜Test des API JSON🎜🎜Laravel fournit également plusieurs fonctions d'assistance pour tester les API JSON et leur réponse . Par exemple, 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

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 :

$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);

Assertions disponibles

🎜🎜🎜🎜

Response Assertion

Laravel fournit une variété de méthodes d'assertion courantes pour les tests PHPUnit. Ces assertions sont accessibles depuis la json, get, post, put,和 delete méthode de test :

assertCookieExpired

Assert que la réponse contient le cookie donné et qu'il a expiré :

$response->assertHeader($headerName, $value = null);

assertCookieNotExpired

Assert que la réponse contient le cookie donné et qu'il n'a pas expiré :

assertCookieMissing
Assert que le cookie donné n'est pas inclus dans la réponse :

$response->assertHeaderMissing($headerName);

assertDontSee
Assert que la chaîne donnée n'est pas incluse dans la réponse :

$response->assertJson(array $data);

assertDontSeeText
Assert que la chaîne donnée n'est pas contenue dans le texte de la réponse :

$response->assertJsonCount($count, $key = null);

assertExactJson
Assert que les données contenues dans la réponse correspondent exactement aux données JSON données :

$response->assertJsonFragment(array $data);

assertForbidden
Assert que la réponse a le code d'état interdit :

$response->assertJsonMissing(array $data);

assertHeader
Assert que la réponse a l'en-tête donné :

$response->assertJsonMissingExact(array $data);

assertHeaderMissing
Affirmer que le donné n'est pas présent dans la réponse En-tête :

$response->assertJsonMissingValidationErrors($keys);

assertJson
Affirmer que la réponse contient les données JSON données :

$response->assertJsonStructure(array $structure);

assertJsonCount
Affirmer que la réponse JSON contient un tableau Attendu pour une clé donnée Nombre d'éléments :

$response->assertJsonValidationErrors($keys);

assertJsonFragment
Affirmer que la réponse ne contient pas l'extrait JSON donné :

$response->assertLocation($uri);

assert JsonMissingExact
Assert que la réponse ne contient pas le fragment JSON exact :

$response->assertNotFound();

assertJsonMissingValidationErrors
Assert que la réponse ne contient pas de JSON pour la clé donnée Erreurs de validation :

$response->assertOk();

assertJsonStructure
Affirmer que la réponse a la structure JSON donnée :

$response->assertPlainCookie($cookieName, $value = null);

assertJsonValidationErrors

Assert que la réponse a l'erreur de validation JSON donnée pour la clé donnée :

$response->assertRedirect($uri);

assertLocation

Assert que la réponse a la valeur URI donnée dans l'en-tête Location :

$response->assertSee($value);

assertNotFound

La réponse d'assertion n'a pas trouvé le code d'état :

$response->assertSeeInOrder(array $values);

assertOk

La réponse d'assertion a le code d'état :

$response->assertSeeText($value);

asser tPlainCookie

affirme que la réponse contient le cookie donné (non chiffré) :

$response->assertSeeTextInOrder(array $values);

assertRedirect

Assert que la réponse redirige vers l'URI donné

$response->assertSessionHas($key, $value = null);

assertSee

Ass ert que la chaîne donnée est contenu dans la réponse Medium :

$response->assertSessionHasAll(array $data);

assertSeeInOrder

Assert que la chaîne donnée est contenue dans le texte de la réponse :

$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');

assertSeeText

Assert that la chaîne donnée est contenue dans le texte de réponse :

$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);

assertSeeTextInOrder

Assert que la chaîne donnée est contenue dans le texte de réponse dans l'ordre :

$response->assertSessionHasNoErrors();

assertSessionHas

Affirmer que la session est contenue Données données :

$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');

assertSessionHasAll

Assert que la session contient une liste de valeurs donnée

$response->assertSessionMissing($key);

assertSessionHasErrors

Affirmer que la session contient une erreur pour un champ donné :

$response->assertStatus($code);

assertSessionHasErrorsIn

Assert que la session contient les erreurs indiquées :

$response->assertSuccessful();

assertSessionHasNoErrors

Assert que la session a aucune erreur :

$response->assertViewHas($key, $value = null);

assertSessionDoesntHaveErrors

Assert que la session n'a pas la clé donnée :

$response->assertViewHasAll(array $data);

assertSessionMissing

Assert que la session ne contient pas la clé donnée :

$response->assertViewIs($value);

assertStatus

Assert que la réponse a le code d'état donné :

$response->assertViewMissing($key);

assertSuccessful

Assert que la réponse a le code d'état de réussite

rrreee

assertViewHas

Assert réponse view est une donnée donnée :

rrreee

assertViewHasAll

Affirmer que la vue de réponse contient la liste de données donnée 

rrreee

assertViewIs

Ass ert route renvoie la vue donnée :

rrreee

assertViewMissing

Assert qu'il manque une donnée de liaison à la vue de réponse :

rrreee

Authentication Assertions

Laravel également vous fournit PHPUnit Testing fournit divers liés à l'authentification Affirmation de :

Assert que cet utilisateur a été authentifié. $this->assertGuest($guard = null);
MethodDescription
$this->assertAuthenticated($guard = null);$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);
Afficher que cet utilisateur n'est pas authentifié.
$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🎜. 🎜🎜