0

我无法让单元测试用于文件上传,并使用 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 只是单元测试的问题——它不是浏览器的问题。

有谁知道为什么在size: 0, mime: inode/x-emptyregisterMediaCollections() 评估时文件属性可能是?

谢谢!

4

1 回答 1

1

我回答得有点晚了,但如果您仍在为 PDF 文件上传和使用 spatie/laravel-medialibray 包保存测试而苦苦挣扎,这里有一个解决方案。

只需像这样创建您的假上传文件:

$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包正确猜测,并且将被创建而不会抛出任何异常。

希望它会有所帮助!

于 2021-02-13T20:08:49.397 回答