我在使用Spatie的medialibrary进行文件上传和存储文件的单元测试时遇到了问题。
代码在浏览器中运行良好:文件可以正确保存。
但是,此单元测试失败:
Storage::fake('resource-files');
$file = UploadedFile::fake()->create('courtform.pdf', 1024);
$response = $this->ActingAs($this->adminUser())
->json('PATCH', '/forms/' . $dbentry->id, [
'name' => 'Form 800',
'state' => 'VT',
'description' => 'General info form',
'file' => $file,
]);
// Assert the file was stored...
Storage::disk('resource-files')->assertExists('1/courtform.pdf');失败是因为mime类型为空:
Spatie\MediaLibrary\Exceptions\FileCannotBeAdded\FileUnacceptableForCollection^ {#1485
#message: "The file with properties `name: courtform.pdf, size: 0, mime: inode/x-empty` was not accepted into the collection named `source-pdfs` of model `App\Form` with id `1`"..。我已经要求这个集合中的文件是PDF:
public function registerMediaCollections()
{
// Keep only one file per model
$this
->addMediaCollection('source-pdfs')
->useDisk('resource-files')
->singleFile()
->acceptsFile(function (File $file) {
return $file->mimeType === 'application/pdf';
});
$this
->addMediaCollection('source-fdfs')
->singleFile();
}但是这个空的mimeType只是单元测试的问题--在浏览器中不是问题。
有人知道为什么用registerMediaCollections()计算文件属性时,文件属性可能是size: 0, mime: inode/x-empty吗?
谢谢!
发布于 2021-02-14 04:08:49
我的回答有点晚了,但这里有一个解决方案,以防您仍然在使用spatie/laravel-medialibray包进行PDF文件上传和保存测试。
只需像这样创建你的假上传文件:
$fakePdfContent = <<<PDF
%PDF-1.4
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
xref
0 4
0000000000 65535 f
0000000009 00000 n
0000000052 00000 n
0000000101 00000 n
trailer<</Size 4/Root 1 0 R>>
startxref
178
%%EOF
PDF;
$fakePdf = UploadedFile::fake()
->createWithContent('fake.pdf', $fakePdfContent)
->mimeType('application/pdf')
->size(10240);由于放入的内容是假的PDF文件是一个真正的空PDF文件内容,所以mimetype被spatie/laravel-medialibrary包正确地猜测出来,并且将被创建而不会抛出任何异常。
希望它能有所帮助!
https://stackoverflow.com/questions/62001494
复制相似问题