我有一个控制器和一个请求类来处理简单的文件上传。 我正在使用测试方法来测试上传的功能。到目前为止,一切都很好。 未到达的控制器部分(因为验证失败 (
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
)?
这个问题比想象中更容易解决。我必须将文件内容作为请求的参数而不是路由。参见:
$file = UploadedFile::fake()->createWithContent('customer.csv', 'id;name;group\n9999;Customer1;');
$response = $this->post(route('import.customers'), ['importfile' => $file]);