iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Modern Web

當拉拉肉遇到單元測試,是否能夠擦出命運的火花?系列 第 24

[Day 23] 針對API的單元測試(三)

我們今天來針對API做更進一步的測試,
假如我們今天要取得一個使用者資料,
這個使用者的資料有 代號(id)、姓名(name)、電話(phone)
我們現在在MyFirstUnitTest.php寫了一個新的方法

public function test_user_get_name()
{
    $this->post('/api/user/1')
        ->assertJson(fn (AssertableJson $json) =>
            $json->where('id', 1)
                ->where('name', '小魚')
                ->missing('password')
                ->etc()
        );
}

我們指定了id跟name參數的內容,
並且不應該出現password這個參數,
後面有一個etc()表示我們忽略其他的參數,
如果回傳的資料有其他的參數,
但是我們沒有調用etc()方法的話,
我們的測試將會失敗。

然後我們來測試看看
php artisan test
https://ithelp.ithome.com.tw/upload/images/20210924/20105694Szj8Ely6rB.png

結果是找不到這個路由,
因為我們還沒有實作,
接下來我們新增一個Model
App\Entity\User.php

<?PHP
namespace App\Entity;

use DateTimeInterface;
use Illuminate\Database\Eloquent\Model;

class User extends Model {
    //資料表名稱
    protected $table = 'user';

    //主鍵名稱
    protected $promaryKey = 'id';

    //可以大量指定異動的欄位(Mass Assignment)
    protected $fillable = [
            'name',
            'phont',
    ];

    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }
}
?>

然後我們在APIController.php新增一個方法,
正常來說我們會去撈資料庫的資料,
或是其他的方式,
不過在這裡我們直接把結果回傳,
當然要記得引用 use App\Entity\User;

function GetUser($id)
{
    $result = new User;

    if($id == 1)
    {
        $result->id = 1;
        $result->name = '小魚';
        $result->phone = '7533967';
    }

    return json_encode($result);
}

然後在api.php新增路由

Route::group(['prefix' =>'user'], function(){
    Route::post('/{id}', [APIController::class, 'GetUser']);
});

我們再測試看看
php artisan test
https://ithelp.ithome.com.tw/upload/images/20210924/20105694C1avjIEbmQ.png

順利地通過測試了!


上一篇
[Day 22] 針對API的單元測試(二)
下一篇
[Day 24] 幾個Json的測試方式
系列文
當拉拉肉遇到單元測試,是否能夠擦出命運的火花?31

尚未有邦友留言

立即登入留言