【问题标题】:How to test Laravel media upload with form validation如何使用表单验证测试 Laravel 媒体上传
【发布时间】:2020-09-29 15:07:27
【问题描述】:

前段时间我在我的 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);
}

当我为 media post 参数添加验证规则时,服务器返回 302 状态代码并且测试失败。但是,当我在浏览器中手动测试媒体上传时,一切正常。

public function uplaodMedia($request) 
{
    $request->validate([
        'media' => 'required'
    ]);

    // ...
}

测试中请求的行为似乎与实际的浏览器请求不同。但是,直到现在我还没有设法解决这个问题。有没有人遇到过类似的事情?

【问题讨论】:

    标签: php laravel validation upload media


    【解决方案1】:

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

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

    Here你可以找到构造函数定义:

    /**
     * @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 提供了一种内置方法来轻松测试文件上传。

    来自docs:

    Storage 门面的 fake 方法可以让你轻松生成一个 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);
    }
    

    【讨论】:

    • 效果很好,非常感谢。模拟图像肯定比使用真实图像更好。我还没有处理足够的问题来弄清楚如何。
    猜你喜欢
    • 2018-05-30
    • 2017-05-23
    • 1970-01-01
    • 2020-10-05
    • 2017-04-18
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多