iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0

Laravel另外還提供了許多的測試方法,

測試多個使用者

我們今天可能從API取得了多個使用者的資料,
譬如以下的情況

Route::get('/users', function () {
    return User::all();
});

我們在測試的時候可以寫成這樣

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has(3)
             ->first(fn ($json) =>
                $json->where('id', 1)
                     ->where('name', '小魚')
                     ->missing('password')
                     ->etc()
             )
    );

has(3)表示有三個User,
其中我們要檢查第一筆資料(first),
id應該是 1,
name應該是 小魚,
不應該有password這個參數。

測試Model在Array裡面

我們今天有一個API長這樣

Route::get('/users', function () {
    return [
        'meta' => [...],
        'users' => User::all(),
    ];
})

我們寫了一個測試如下:

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
             ->has('users', 3)
             ->has('users.0', fn ($json) =>
                $json->where('id', 1)
                     ->where('name', '小魚')
                     ->missing('password')
                     ->etc()
             )
    );

表示我們預期會有一個meta參數,
然後使用者會有3個,
其中的第一個使用者,
id應該是 1,
name應該是 小魚,
不應該有password這個參數。

或是可以簡化成這樣,
少做一次動作,
也能達到同樣的結果:

$response
    ->assertJson(fn (AssertableJson $json) =>
        $json->has('meta')
             ->has('users', 3, fn ($json) =>
                $json->where('id', 1)
                     ->where('name', '小魚')
                     ->missing('password')
                     ->etc()
             )
    );

測試參數的類型

我們也可以用測試的方法來確認參數的類型是否吻合,
譬如這樣:

$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('id', 'integer')
         ->whereAllType([
            'users.0.name' => 'string',
            'meta' => 'array'
        ])
);

我們也可以用 | 或是 Array 來指定多種類型

$response->assertJson(fn (AssertableJson $json) =>
    $json->whereType('name', 'string|null')
         ->whereType('id', ['string', 'integer'])
);

這樣我們可以根據不同的需求,
靈活運用測試方法來達到我們的目的。


上一篇
[Day 23] 針對API的單元測試(三)
下一篇
[Day 25] 測試文件上傳
系列文
當拉拉肉遇到單元測試,是否能夠擦出命運的火花?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言