iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Modern Web

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

[Day 21] 針對API的單元測試(一)

我們再回來寫API的單元測試,
之前的範例只有寫到回傳單一值而已,
但是通常我們寫的API,
會是一個Json的格式,
而且可能會有複雜的內容,
可能有固定的格式,
也可能沒有。

我們接下來要實作一個API,
當我們用Post傳送一個name資料過去的時候,
就要回傳新增資料成功的回應。
(當然只是模擬,我們這次不會操作資料庫)
我們在BrowserUnitTest.php新增一個方法

public function test_user_add_name()
{
    $this->post('/api/user/add', ['name' => 'Sally'])
         ->seeJson([
             'created' => true,
         ]);
}

我們預期這個Json會包含 ['created' => true] 這個內容,
然後執行測試,
當然這個測試一定會失敗
php artisan test
https://ithelp.ithome.com.tw/upload/images/20210922/20105694aJfkM33dMM.png

如同我們所預期的,
測試回傳了錯誤,
然後我們接下去寫API

我們先把原來的api.php改成跟web.php一樣的型式

use App\Http\Controllers\API\APIController;
Route::post('/getLeapYear/{year}', [APIController::class, 'checkLeapYear']);

然後在APIController新增一個API方法
記得要 use Validator;

function AddUser(Request $request)
{
    $input = $request->all();

    //驗證規則
    $rules = [
        //名稱
        'name' => [
            'required',
        ],
    ];

    //驗證資料
    $validator = Validator::make($input, $rules);

    $result = [];
    if($validator->fails())
    {
        $result['created'] = false;
    }
    else
    {
        $result['name'] = $input['name'];
        $result['created'] = true;
    }
    return json_encode($result);
}

然後在api.php新增

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

我們再執行一次測試
php artisan test
https://ithelp.ithome.com.tw/upload/images/20210922/20105694QXab6N1yPJ.png

我們測試成功了!


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

尚未有邦友留言

立即登入留言