Testing Api using PHPUnit Laravel
阿新 • • 發佈:2020-04-16
首先複製.env.example檔案重新命名為.env.testing:
然後,執行:
touch test.sqlite
將在 D:/laragon/www/laraveauth 目錄下生成一個test.sqlite檔案:
然後我們將.env.testing檔案資料庫配置修改為:
DB_CONNECTION=sqlite DB_DATABASE="D:/laragon/www/laraveauth/test.sqlite"
接下來執行:
php artisan make:test TaskApiTest
檔案位於:
接下來,修改這個檔案之前,執行一下
php artisan route:list
檢視一下api task請求的相關route:
先來實現測試建立Task的方法:
方法命名為比較容易理解的就行;
傳送post請求到/api/task;最後程式碼如下:
public function testCanCreateTask() { $formData = [ ‘title‘ => ‘sample test task title‘,‘description‘ => ‘sample test task description‘,‘due‘ => ‘next friday‘,]; $response = $this->post(route(‘tasks.store‘),$formData); $response->assertStatus(201); }
由於phpunit存在於 vendor\bin資料夾下:
所以:控制檯執行:
.\vendor\bin\phpunit.bat
結果:
錯誤解決:
1.env.testing檔案中APP_KEY未設定:
拷貝一個.env檔案中的即可;
再次執行:
.\vendor\bin\phpunit.bat
結果:
沒有頭緒,我們需要這個:
$this->withoutExceptionHandling();
再次執行:
.\vendor\bin\phpunit.bat
可以發現出現了更多的錯誤trace資訊:
結果就是 我們執行store方法前未登入:
修改後及執行結果如下:
修正方法:laragon開啟pdo_sqlite擴充套件。【只要php開啟sqlite的擴充套件就可以了】
我們再在類內新增一個trait
use RefreshDatabase;
這個trait會在每次單元測試的時候重新整理資料庫。【對migration執行一次migrate】
再次執行:
.\vendor\bin\phpunit.bat
測試通過!
接下來我們斷言Json
結果失敗:
修改一下及結果仍然失敗:
再次修改:
測試通過!
其餘的測試不寫了。
文件看這裡:測試指南
TaskApiTest.php檔案如下:
<?php namespace Tests\Feature; use App\Task; use App\User; use Carbon\Carbon; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class TaskApiTest extends TestCase { use RefreshDatabase; protected $user; public function setUp(): void { parent::setUp(); $this->user = factory(User::class)->create(); $this->actingAs($this->user,‘api‘); } /** * A basic feature test example. * * @return void */ public function testCanCreateTask() { $due = Carbon::parse(‘next friday‘); $formData = [ ‘title‘ => ‘sample test task title‘,0);">description‘ => ‘sample test task description‘,0);">due‘ => $due,]; $this->withoutExceptionHandling(); $response = $this->post(route(‘tasks.store‘),$formData); $response->assertStatus(201) ->assertJson([‘data‘ => $formData]); } public function testCanShowTask() { $task = factory(Task::class)->create(); $this->user->tasks()->save($task); $response = $this->get(route(‘tasks.show‘,$task->id)); $response->assertStatus(200); } public function testUpdateTask() { $task = factory(Task::class)->create(); $this->user->tasks()->save($task); $due = Carbon::parse(‘next friday‘); $formData = [ ‘tasks.update‘,$task->id),$formData); $response->assertStatus(200) ->assertJson([‘function testDelete() { $task = factory(Task::class)->create(); $this->user->tasks()->save($task); $response = $this->delete(route(‘tasks.destroy‘,$task)); $response->assertStatus(200)->assertJson([‘message‘ => ‘Success deleted!‘]); } public function testShowAllTasks() { $tasks = factory(Task::class,3)->create(); $this->user->tasks()->saveMany($tasks); $response = $this->get(route(‘tasks.index‘)); $response->assertStatus(200)->assertJson($tasks->toArray()); } }