为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用表单验证测试 Laravel 媒体上传

如何使用表单验证测试 Laravel 媒体上传

PHP
一只甜甜圈 2023-05-12 16:04:14
前段时间我在我的 laravel 项目中为我的媒体上传写了一个测试。测试只是将带有图像的 post 请求发送到路由,并检查服务器是否发送 200 状态代码。use Illuminate\Http\UploadedFile;/** @test */public function it_can_upload_image(){    $response = $this->post('/media', [        'media' => new UploadedFile(__DIR__ . "/test_png.png", 'test_png.png'),    ]);    $response->assertStatus(200);}当我为 post 参数添加验证规则时,media服务器返回 302 状态代码并且测试失败。但是,当我在浏览器中手动测试媒体上传时,一切正常。public function uplaodMedia($request) {    $request->validate([        'media' => 'required'    ]);    // ...}测试中请求的行为似乎与实际的浏览器请求不同。但是,直到现在我还没有设法解决这个问题。有没有人遇到过类似的事情?
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

在为测试创建新的时,您需要传递true参数:$testUploadedFile

new UploadedFile(__DIR__ . "/test_png.png", 'test_png.png', null, null, true)

在这里您可以找到构造函数定义:

/**

 * @param bool        $test         Whether the test mode is active

 *                                  Local files are used in test mode hence the code should not enforce HTTP uploads

 */

public function __construct(string $path, string $originalName, string $mimeType = null, int $error = null, bool $test = false)

虽然我不明白为什么要使用真实图像进行此测试,但 Laravel 提供了一种内置方式来轻松测试文件上传。


从文档:


Storage facade 的 fake 方法允许您轻松生成一个假磁盘,结合 UploadedFile 类的文件生成实用程序,大大简化了文件上传的测试。


因此,您的测试可以简化为以下内容:


use Illuminate\Http\UploadedFile;

use Illuminate\Support\Facades\Storage;


/** @test */

public function it_can_upload_image()

{        

    Storage::fake();


    $this->post('/media', ['media' => UploadedFile::fake()->image('test_png.png')])

        ->assertStatus(200);

}


查看完整回答
反对 回复 2023-05-12
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信