Laravel UnitTest 測試上傳圖片檔案

實作遇到的bug

當時所有的網路上都是提供這個方法,但跑測試都是取得 Http code 422,驗證失敗的錯誤訊息

反覆測試移除掉 'mimes:png,jpg,jpeg' 就可以通過,但印出來的file檔案內容有點奇怪

後來發現,由於我有將 faker image 寫成一個 function 提供給不同的情境可以做使用

在 return 的型別中指定了 string

導致回傳的東西會是字串而非圖片物件

再此分享,給有可能遇到相同問題的有緣人

錯誤版本

1
2
3
4
public function fakerImage(): string
{
return UploadedFile::fake()->image('test.jpg');
}

正確版本

1
2
3
4
5
6
use use Illuminate\Http\UploadedFile;

public function fakerImage(): UploadedFile
{
return UploadedFile::fake()->image('test.jpg');
}

程式碼

1
2
3
4
5
6
use Illuminate\Http\UploadedFile;

$params = [
'image' => UploadedFile::fake()->image('test.jpg');
];
$this->json('post', route('route_name'), $params);

調整圖片大小、Mimes

搭配 Request 的 Validation

1
2
3
4
5
6
public function rules()
{
return [
'photo' => ['required', 'mimes:png,jpg,jpeg', 'max:10240'],
];
}
1
2
UploadedFile::fake()->image('test.jpg')->size(10240);
UploadedFile::fake()->image('test.png')->mimeType('image/png');