Laravel:如何用真实文件测试文件上传?

问题描述 投票:0回答:1

我有一个控制器和一个请求类来处理简单的文件上传。 我正在使用测试方法来测试上传的功能。到目前为止,一切都很好。 未到达的控制器部分(因为验证失败 (

importfile needs to be a file.
)),如下所示:

public function importCustomers(ImportCustomersRequest $request)
{
    dump('importCustomers called!');

请求类

ImportCustomersRequest
的相关部分是这样的:

public function rules(): array
{
    dump('importfile', $this->importfile);

    return [
        'importfile' => 'required|file',
    ];
}

用于测试的代码是:

$file = UploadedFile::fake()->createWithContent('customer.csv', 'id;name;group\n9999;Customer1;');

// other approachs that did not work:
// $file = UploadedFile::fake()->create('customer.csv')
//
// testing with a real file would be ok too (the file exists!) - but nada (i receive the file content instead of an UploadedFile):
// $file = Storage::path('development/customers.csv')

$response = $this->post(route('import.customers', ['importfile' => $file]));
$response->assertStatus(302);
...

使用前端上传(和真实文件)转储请求类中的 importfile 值会产生所需的

Illuminate\Http\UploadedFile {#2053 ▼
  -test: false
  -originalName: "customers.csv"
  -mimeType: "text/csv"
  -error: 0
  ...

使用上面的 phpunit 测试给了我

array:2 [
  "name" => "customer.csv"
  "sizeToReport" => "67"
]

这显然失败了。

我如何上传通过验证的测试文件(最好是包含内容的真实文件)(

UploadedFile
)?

php laravel testing file-upload xunit
1个回答
4
投票

这个问题比想象中更容易解决。我必须将文件内容作为请求的参数而不是路由。参见:

$file = UploadedFile::fake()->createWithContent('customer.csv', 'id;name;group\n9999;Customer1;');
$response = $this->post(route('import.customers'), ['importfile' => $file]);
© www.soinside.com 2019 - 2024. All rights reserved.