1. 程式人生 > WINDOWS開發 >Testing Api using PHPUnit Laravel

Testing Api using PHPUnit Laravel

首先複製.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());
    }
}