如何在Laravel测试中使用Faker上传伪造文件(图片、视频等)
Laravel测试中伪造图片/视频上传的实现方法
Laravel测试套件内置的UploadedFile类fake()方法,可快速生成符合验证规则的伪造文件,无需依赖真实物理文件。
1. 生成指定格式的伪造文件
伪造符合规则的图片
针对你的mimes:jpg,jpeg,bmp,png验证规则,直接用image()方法指定对应格式:
use Illuminate\Http\UploadedFile; // 生成伪造jpg图片 $fakeJpg = UploadedFile::fake()->image('avatar.jpg'); // 生成伪造png图片 $fakePng = UploadedFile::fake()->image('cover.png');
伪造符合规则的MP4视频
针对mimes:mp4规则,用create()方法指定文件名、大小和对应MIME类型:
// 生成10MB大小的伪造MP4视频 $fakeMp4 = UploadedFile::fake()->create('demo.mp4', 10240, 'video/mp4');
注:第二个参数为文件大小(单位KB),第三个参数必须匹配验证规则对应的MIME类型,确保验证通过。
2. 完整测试用例示例
以下是模拟文件上传、验证规则的测试代码:
<?php namespace Tests\Feature; use Illuminate\Http\UploadedFile; use Tests\TestCase; class MediaUploadTest extends TestCase { /** @test */ public function valid_image_and_video_pass_validation() { // 生成符合规则的伪造文件 $validImage = UploadedFile::fake()->image('profile.jpg'); $validVideo = UploadedFile::fake()->create('product.mp4', 5120, 'video/mp4'); // 模拟POST请求提交文件 $response = $this->post('/your-upload-route', [ 'image' => $validImage, 'video' => $validVideo, ]); // 断言验证通过(根据实际业务逻辑调整断言) $response->assertStatus(200); // 若业务逻辑包含文件存储,可断言文件已被存储 UploadedFile::fake()->assertStored($validImage); UploadedFile::fake()->assertStored($validVideo); } /** @test */ public function invalid_file_format_fails_validation() { // 生成不符合规则的文件 $invalidImage = UploadedFile::fake()->image('test.gif'); $invalidVideo = UploadedFile::fake()->create('test.avi', 5120, 'video/x-msvideo'); $response = $this->post('/your-upload-route', [ 'image' => $invalidImage, 'video' => $invalidVideo, ]); // 断言验证失败并返回对应错误信息 $response->assertSessionHasErrors([ 'image' => 'The image must be a file of type: jpg, jpeg, bmp, png.', 'video' => 'The video must be a file of type: mp4.', ]); } }
3. 额外实用技巧
- 伪造图片时可指定尺寸:
UploadedFile::fake()->image('test.jpg', 800, 600);(宽800px,高600px) - 伪造文件仅存在于内存中,测试结束后自动销毁,无需手动清理磁盘文件
内容的提问来源于stack exchange,提问作者Arslan Majeed
相关产品推荐
相关产品推荐

