如何在Laravel 5.2中使用文件上传进行单元测试+代码覆盖

时间:2016-04-01 08:17:47

标签: phpunit code-coverage laravel-5.2

我想在Laravel 5.2上使用文件上传进行一些单元测试。

我是这样做的,请参阅此answer

/** app/Http/routes.php **/
Route::post('upload', function() {
    $fileExists = false;

    if ($_FILES['images']) {
        $fileExists = true;
    }

    return ['result' => $fileExists];
});

/** tests/ExampleTest.php **/
public function testUploadFile()
{
    $file = new \Symfony\Component\HttpFoundation\File\UploadedFile(
        base_path() . '/tests/files/profile.png', 'profile.png');

        $response = $this->call('POST', 'upload', 
            [
               'firstname' => 'firstname', 
               'lastname'  => 'lastname', 
               'promotion' => '2016', 
               'isCoop' => 1
            ], 
            [
               'images' => [$file]
            ]
        );
}

phpunit的结果是: phpunit result

但是,当我检查代码覆盖率结果时,routes.php文件中if语句内的行不会执行,如下所示。

Code coverage result

似乎上传的文件未插入$_FILES变量,因此检测为空。

任何想法如何解决它..?感谢。

注意:我使用Larave创建API服务,因此我没有使用表单上传文件

2 个答案:

答案 0 :(得分:1)

在laravel 5.2.15之后,这种情况正在发生,因为你正在使用

Symfony\Component\HttpFoundation\File\UploadedFile

而不是

Illuminate\Http\UploadedFile

文件永远不会发送到控制器。

答案 1 :(得分:0)

我认为你应该写:

[
    'images' => $file
]

而不是

[
    'images' => [$file]
]

另外,你应该在5.2.15之后使用Illuminate \ Http \ UploadedFile而不是Symfony \ Component \ HttpFoundation \ File \ UploadedFile,参见Laravel 5.2 Mocked file upload unit test fails