【问题标题】:Mocking an uploaded file with content使用内容模拟上传的文件
【发布时间】:2019-11-25 09:22:23
【问题描述】:

我正在开发一个将 GraphQL 和 Lighthouse 用于后端 API 的 Laravel 项目。 对于某些端点,我们支持文件上传。我们已经成功地对其进行了测试。

我们现在正在创建的新端点也将支持文件上传。但是,我们必须读取这个文件的内容并根据这个内容做一些事情,而不是仅仅将文件存储在我们服务器上的某个地方。

我们当然想测试这个新功能。但要做到这一点。我们必须模拟一个具有特定内容的上传文件来测试它。我所能找到的只是一个伪造的UploadedFile::fake() 方法,它为你创建了一个随机/空文件。

我知道我可以为此创建单元测试。但我真的很想添加一个端到端的测试。

official lighthouse docs 的代码示例如下:

<?php

$this->multipartGraphQL(
    [
        'operations' => /* @lang JSON */
            '
            {
                "query": "mutation Upload($file: Upload!) { upload(file: $file) }",
                "variables": {
                    "file": null
                }
            }
        ',
        'map' => /* @lang JSON */
            '
            {
                "0": ["variables.file"]
            }
        ',
    ],
    [
        '0' => UploadedFile::fake()->create('image.jpg', 500),
    ]
)

我需要用我自己创建的模拟替换那个上传的文件。可能是这样的:

<?php

UploadedFile::fake()
    ->fromPath('example/file/in/my/testsuite.obj')
    ->create()

是否有任何内置方法可以设置假上传文件的内容?或者有什么方法可以用我自己的工厂逻辑扩展类?

【问题讨论】:

  • 如果你有文件没有理由造假,只需使用new File并将路径传递给你的测试文件。

标签: php laravel testing phpunit laravel-lighthouse


【解决方案1】:

要根据测试文件在 Laravel 中伪造文件,您可以使用 new File。 班级是Illuminate\Http\File

构造函数采用路径并从该文件路径为您提供一个文件。因此,要使用您的示例,将按以下方式创建假文件

new File('example/file/in/my/testsuite.obj')

然后您只需将发送到 Lighthouse 的文件设置为该文件即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2022-01-26
    相关资源
    最近更新 更多