猿问

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

前段时间我在我的 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'

    ]);


    // ...

}

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


一只甜甜圈
浏览 111回答 1
1回答

一只名叫tom的猫

在为测试创建新的时,您需要传递true参数:$testUploadedFilenew 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);}
随时随地看视频慕课网APP
我要回答