Ujian HTTP


Ujian HTTP

  • Pengenalan
    • Pengepala permintaan tersuai
  • Sesi/Pengesahan
  • Menguji JSON API
  • Menguji Muat Naik Fail
  • Kaedah Penegasan yang Tersedia
    • Penegasan Balas

Pengenalan

Laravel menyediakan API yang sangat lancar untuk kedua-dua penjanaan permintaan HTTP dan pemeriksaan output. Sebagai contoh, anda boleh menyemak kes ujian ini di bawah:

<?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);  
         }
      }

Kaedah get mencipta permintaan GET kepada aplikasi anda dan assertStatus Kaedah ini menegaskan bahawa respons yang dikembalikan ialah kod status HTTP yang ditentukan. Sebagai tambahan kepada pernyataan mudah ini, Laravel juga termasuk pelbagai pernyataan yang menyemak pengepala respons, kandungan, JSON, struktur, dll. 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

Menyesuaikan pengepala permintaan

Anda boleh menggunakan The kaedah withHeaders menyesuaikan pengepala permintaan sebelum menghantarnya ke aplikasi. Anda boleh menambah sebarang pengepala tersuai yang anda mahukan.
<?php
    class ExampleTest extends TestCase{   
     /**
     * 一个基本的功能测试用例。
     *
     * @return void
     */  
      public function testBasicExample()  
        {     
           $response = $this->json('POST', '/user', ['name' => 'Sally']);        
           $response         
              ->assertStatus(201)            
              ->assertExactJson([           
                   'created' => true,           
                  ]);  
         }
     }
{tip} Perisian tengah CSRF dilumpuhkan secara automatik apabila menjalankan ujian. 🎜🎜🎜🎜
🎜🎜Sesi / Pengesahan 🎜🎜Laravel menyediakan beberapa pilihan yang boleh digunakan dalam HTTP Gunakan fungsi pembantu Sesi semasa menguji. Mula-mula, anda perlu menghantar tatasusunan kepada kaedah withSession untuk menetapkan data Sesi. Ini memudahkan anda memuatkan Sesi dengan data sebelum menghantar permintaan ujian aplikasi: 🎜
<?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');   
       }
 }
🎜 Sudah tentu, Sesi biasanya digunakan untuk mengekalkan status pengguna, seperti mengesahkan pengguna. Fungsi pembantu actingAs menyediakan cara mudah untuk menentukan pengguna untuk disahkan sebagai pengguna semasa. Sebagai contoh, kita boleh menggunakan model kilang untuk menjana dan mengesahkan pengguna: 🎜
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
🎜Anda juga boleh menentukan pemerhati yang mana pengguna disahkan dengan menghantar nama pemerhati sebagai parameter kedua actingAs: 🎜
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
🎜
🎜🎜
🎜🎜Menguji API JSON🎜🎜Laravel juga menyediakan beberapa fungsi pembantu untuk menguji JSON API dan tindak balasnya . Contohnya, json, get, post, let, patch dan < kod >padam boleh digunakan untuk menghantar pelbagai tindakan HTTP. Anda juga boleh menghantar data dan meminta pengepala ke dalam kaedah ini dengan mudah. Mari kita mula menggunakannya dengan menulis permintaan POST kepada /user dan menegaskan kembali data yang dijangkakan: 🎜
$response->assertCookie($cookieName, $value = null);
🎜{tip} assertJson Kaedah menukarkan respons kepada tatasusunan dan menggunakan PHPUnit::assertArraySubset untuk mengesahkan bahawa tatasusunan yang diberikan hadir dalam respons JSON yang dikembalikan oleh aplikasi. Jadi, jika terdapat atribut lain dalam respons JSON, ujian masih akan lulus memandangkan kehadiran tatasusunan: 🎜
🎜
🎜🎜
🎜

Sahkan Padanan Tepat

🎜Jika anda ingin mengesahkan bahawa tatasusunan yang diberikan tepat sepadan dengan hasil JSON yang dikembalikan oleh aplikasi anda, anda harus menggunakan assertExactJson Kaedah: 🎜
$response->assertCookieExpired($cookieName);
🎜🎜🎜🎜🎜🎜

Uji muat naik fail

IlluminateHttpUploadedFile menyediakan kaedah palsu untuk menjana fail atau imej maya untuk tujuan ujian. Ia boleh digabungkan dengan kaedah palsu fasad Storage untuk memudahkan ujian muat naik fail. Sebagai contoh, anda boleh menggabungkan dua fungsi untuk menguji borang muat naik avatar dengan mudah: IlluminateHttpUploadedFile 提供了一个 fake 方法用于生成虚拟的文件或者图像以供测试之用。 它可以和 Storage facade 的 fake 方法相结合, 大幅度简化了文件上传测试。举个例子,你可以结合这两者的功能非常方便地进行头像上传表单测试:

$response->assertCookieNotExpired($cookieName);

虚拟文件制定

在使用 fake 方法创建文件时,你可以指定图像的宽高以及大小,从而更好的验证测试规则:

$response->assertCookieMissing($cookieName);

除创建图像外,你也可以用 create

$response->assertDontSee($value);

Formulasi fail maya

Apabila menggunakan < kaedah kod>palsu untuk mencipta fail, anda boleh menentukan lebar, ketinggian dan saiz imej untuk mengesahkan peraturan ujian dengan lebih baik:

$response->assertDontSeeText($value);
Selain mencipta imej, anda juga boleh menggunakan create< /code> kaedah untuk mencipta jenis fail lain:

$response->assertExactJson(array $data);

Kenyataan yang tersedia

🎜🎜🎜🎜

Penegasan Balasan

Laravel menyediakan pelbagai kaedah penegasan biasa untuk ujian PHPUnit. Penegasan ini boleh diakses daripada kaedah ujian: json, get, post, put,和 delete

assertCookie
assertCookieExpired
assertCookieNotExpired
assertCookie tegaskan tDontSeeText
assertExactJson
assertForbidden
assertHeader
assertHeaderMissing
assertJson
assertJsonCount
assertJsonFragment
assertJsonMissing
actassertJsonCount
assertJsonFragment
assertJsonMissing
actassertMissing JsonMissingValidationErrors.
assertredirect
assertsee
assertseeinorder
assertseetext
assertseetextinorder
assertsessionHas
assertSessionHasall
assertsessionHaserRors
assertSessionHaserrorsin
assertSessionHasnoerrorserSessiesSessionDaveShaveRorshineDaveShaveRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRorshineRors assertStatus
assertBerjaya
assertViewHas
assertViewHasAll
assertViewIs
assertViewHas
assertViewHasAll
assertViewIs
assertView

assertCookieTegaskan bahawa kuki yang diberikan disertakan dalam respons:

$response->assertForbidden();


assertCookieExpired

Tegaskan bahawa respons mengandungi kuki yang diberikan dan bahawa ia telah tamat tempoh:

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

assertCookieNotExpired

Assert CookieNotExpired

mempunyai kuki yang diberimempunyai kuki yang diberikan dan ia mengandungi:

$response->assertHeaderMissing($headerName);

assertcookiemissing

assert bahawa kuki yang diberikan tidak termasuk dalam respons:

$response->assertJson(array $data);
e

assertdontsee

assert bahawa rentetan yang diberikan tidak termasuk dalam respons:

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

assertDontSeeText

Tegaskan bahawa rentetan yang diberikan tidak terkandung dalam teks respons:

$response->assertJsonFragment(array $data);

assertExactJson

assertExactJson

assert data yang diberikan tepat dalam data JSONrr yang terkandung dalam jawapan yang diberikan

.

assertHeaderMissing

Tegaskan bahawa yang diberikan tidak ada dalam Tajuk respons:

$response->assertJsonMissing(array $data);

assertJson

Tegaskan bahawa respons mengandungi Data JSON yang diberikan:

$response->assertJsonMissingExact(array $data);

Tegaskan bahawa tindak balas JSON mengandungi tatasusunan yang Diharapkan untuk kunci yang diberikan Bilangan elemen:
$response->assertJsonMissingValidationErrors($keys);

assertJsonFragment

Tegaskan bahawa respons tidak mengandungi Coretan JSON yang diberikan:
$response->assertJsonStructure(array $structure);

sertJsonMissingExactTegaskan bahawa respons tidak mengandungi serpihan JSON yang tepat:

$response->assertJsonValidationErrors($keys);

assertJsonMissingValidationErrorsTegaskan bahawa respons tidak mengandungi JSON untuk ralat Pengesahan kunci yang diberikan:

assertJsonStructure

Tegaskan bahawa respons mempunyai struktur JSON yang diberikan:

$response->assertLocation($uri);

assertJsonValidationErrors

Tegaskan bahawa respons mempunyai ralat pengesahan JSON yang diberikan untuk kunci yang diberikan:

$response->assertNotFound();

assertLocation

assertLocationLocation

Tegaskan

nilai URI yang diberikan dalam kepala URI yang diberikan

.

tegaskan tPlainCookie

Tegaskan bahawa respons mengandungi kuki yang diberikan (tidak disulitkan):

$response->assertOk();

assertRedirect

Tegaskan bahawa respons akan diubah hala ke URI yang diberikan:

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

Tegaskan bahawa yang diberikan rentetan terkandung dalam Medium respons:

$response->assertRedirect($uri);

assertSeeInOrder

Tegaskan bahawa rentetan yang diberikan terkandung dalam teks respons:

$response->assertSee($value);

Tegaskan bahawa rentetan yang diberikan adalah terkandung dalam teks respons :

$response->assertSeeInOrder(array $values);

assertSeeTextInOrder

Tegaskan bahawa rentetan yang diberikan terkandung dalam teks respons mengikut urutan:

$response->assertSeeText($value);

ssert

Tegaskan bahawa sesi terkandung Diberi data:

$response->assertSeeTextInOrder(array $values);

assertSessionHasAll
Tegaskan bahawa sesi itu mengandungi senarai nilai yang diberikan:

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

assertSessionHasAllTegaskan bahawa sesi itu mengandungi senarai nilai yang diberikan:

$response->assertSessionHasAll(array $data);

Tegaskan bahawa sesi itu mengandungi ralat untuk medan tertentu:

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

assertSessionHasErrorsIn

Tegaskan bahawa sesi itu mempunyai ralat yang diberikan:

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

Tegaskan

Tegaskan sesi tiada ralat:

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors Tegaskan bahawa sesi tidak mempunyai ralat kunci yang diberikan:

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

assertSessionMissingTegaskan bahawa sesi itu tidak mengandungi kunci yang diberikan:

$response->assertSessionMissing($key);
🎜🎜🎜🎜🎜🎜🎜

assertStatus

Tegaskan bahawa respons mempunyai kod status yang diberikan:

$response->assertStatus($code);

assertSuccessful

Tegaskan bahawa respons mempunyai kod status kejayaan

rr:
assertViewHas

Tegaskan respons paparan ialah sekeping data yang diberikan:

$response->assertSuccessful();

assertViewHasAll

Tegaskan bahawa paparan respons mempunyai senarai data yang diberikan:

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

laluan ssert mengembalikan pandangan yang diberikan :

$response->assertViewHasAll(array $data);

assertViewMissing

Tegaskan bahawa paparan respons tiada sekeping data yang mengikat:

$response->assertViewIs($value);

Pengesahan

menyediakan anda dengan PHPUnit Pengujian menyediakan pelbagai Penegasan berkaitan pengesahan: KaedahPenerangan telah disahkan pengguna
$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);$this->assertAuthenticated($guard = null);
$this->assertGuest($guard = null);Tegaskan bahawa pengguna ini tidak disahkan.
🎜🎜$this->assertAuthenticatedAs($user, $guard = null);🎜🎜Tegaskan bahawa pengguna yang diberikan telah disahkan. 🎜🎜🎜🎜$this->assertCredentials(array $credentials, $guard = null);🎜🎜Tegaskan bahawa kelayakan yang diberikan adalah sah. 🎜🎜🎜🎜$this->assertInvalidCredentials(array $credentials, $guard = null);🎜🎜Tegaskan bahawa kelayakan yang diberikan adalah tidak sah. 🎜🎜🎜🎜🎜Artikel ini pertama kali diterbitkan di laman web 🎜LearnKu.com🎜. 🎜🎜