【问题标题】:How to test upload file in laravel 5.0?如何在 laravel 5.0 中测试上传文件?
【发布时间】:2019-10-27 14:09:47
【问题描述】:

我想测试我的文件上传操作。

我检查了该操作的文件类型验证。它通过浏览器交互工作,但我尝试使用 phpunit 验证失败。

我确认只接受 jpg 或 jpeg 文件。

这是我的单位代码

public function testWIthJpgImage()
{
    $_FILES = [
        'front_image' => [
            'name' => 'uitest',
            'type' => 'image/jpeg',
            'size'=> filesize(storage_path('data/uitest.jpg')),
            'error' => 0,
            'tmp_name' => storage_path('data/uitest.jpg')
        ]
    ];

    $response = $this->call('POST', '/api/test',[],[],$_FILES);
    $data = json_decode($response->getContent());
    dd($data); // here validation fail always
    $this->assertEquals(200, $response->getStatusCode());
}

如何在 phpunit 上正确测试文件上传?我的 laravel 5.0 版(旧版) Laravel UploadFile 不可用

【问题讨论】:

  • enctype/multipart 我认为在来自测试环境的通话后,这是缺失的
  • 我应该如何添加该内容类型
  • 我认为您正在使用框架,为什么不使用 Log 外观并检查 Log 中存在的内容?
  • 不,我认为这不是抛出错误!这是需要解决 phpunit 文件上传请求(测试模式)的问题,因为控制器会对其进行验证并照常返回...

标签: php laravel phpunit


【解决方案1】:

您可以为此使用Illuminate\Http\UploadedFile Facade。

这是我上传和存储文件的一个项目的示例。它还有一个文件表和模型。

/** @test */
function create_new_file ()
{

    $payload = [
        'file' => UploadedFile::fake()->image('avatar.jpg')
    ];

    // act
    $response = $this->post("/api/files", $payload);

    // test
    $response->assertStatus(201);

    Storage::disk('local')->assertExists(File::first()->path);
}

别忘了

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

另外你可以使用

Storage::fake('local');

为了不保留上传的文件(如果您像我一样使用存储)。这非常方便,因此您的测试不会在您的上传文件夹中创建一堆文件。

【讨论】:

  • 我找到了很多!但是我的 laravel 版本是 5.0 很旧了! UploadFile 在 Illuminate 中不存在 ...
  • 哦,对不起-你还在下面说,我没看到
【解决方案2】:

我认为我的问题已经解决了,但这样做太奇怪了:) 我同时设置了 $_FILES 和 Symfony UploadedFile :

$_FILES = [
    'front_image' => [
        'name' => 'uitest',
        'type' => 'image/jpeg',
        'size'=> filesize(storage_path('data/uitest.jpg')),
        'error' => 0,
        'tmp_name' => storage_path('data/uitest.jpg'),
        'test' => true
    ]
];
$uploadedFile = new Symfony\Component\HttpFoundation\File\UploadedFile(
  storage_path('data/uitest.jpg'),
  'uitest.jpg',
  'image/jpeg',
  filesize(storage_path('data/uitest.jpg')),
  0,
  true
);
$response = $this->call('POST', '/api/test',[],[],['front_image' => $uploadedFile]);

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 2019-12-28
    • 1970-01-01
    • 2020-11-29
    • 2016-01-21
    • 2017-09-03
    • 2010-11-13
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多