模拟内容上传的文件

时间:2019-07-16 15:23:50

标签: php laravel testing laravel-5 phpunit

我正在做一个Laravel项目,该项目利用GraphQL和Lighthouse作为后端API。 对于某些端点,我们具有文件上传支持。我们已经成功测试了。

我们现在正在创建的新端点也将支持文件上传。但是,我们不仅需要将文件存储在服务器上的某个位置,还必须阅读该文件的内容,然后根据此内容执行某些操作。

我们当然要测试这个新功能。但是要做到这一点。我们必须模拟具有特定内容的上传文件进行测试。我所能找到的只是一个伪造的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()

我可以通过任何内置方式来设置伪造的上传文件的内容吗?还是我可以用自己的工厂逻辑扩展类?

1 个答案:

答案 0 :(得分:0)

要根据测试文件在Laravel中伪造文件,可以使用new File。 该类为Illuminate\Http\File

构造函数采用路径,并从该文件路径给您一个文件。因此,以您的示例为例,伪文件将通过以下方式创建

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

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