在 lumen 5.5 中测试文件上传

Testing file upload in lumen 5.5

我使用的是 Lumen 5.5,我编写了简单的上传文件的应用程序。

我这样写测试(按照this教程)

<?php

class UploadImageTest extends TestCase
{

    Use DatabaseMigrations;

    public function testUploadingImageSuccessfully()
    {
        $this->json('POST', '/images', [
            'image' => UploadedFile::fake()->image('image.jpg')
        ])->assertResponseOk()
    }

}

问题是在我的控制器中,$request->file('image') returns null.

<?php

use Illuminate\Http\Request;

class UploadController extends Controller
{

    public function upload(Request $request)
    {
        if ($request->file('image')) { // always return null
            return "File is uploaded!";
        }

        return "File is not uploaded!";
    }

}

我检查了其他问题(例如 )并尝试了给定的解决方案,但没有成功!

我在搜索同一问题的答案时遇到了这个问题,但不确定它是否相关,所以我提出了一个与我的用例相关的问题。 (Here)

解决方案很简单:UploadedFile::fake() 不适用于 JSON,因为它使用 XmlHttpRequest 伪造文件上传(据我所知)。因此你必须改变你的测试:

public function testUploadingImageSuccessfully()
{
    $this->json('POST', '/images', [
        'image' => UploadedFile::fake()->image('image.jpg')
    ])->assertResponseOk()
}

对此:

public function testUploadingImageSuccessfully()
{
    $this->call('POST', '/images', [
        'image' => UploadedFile::fake()->image('image.jpg')
    ])->assertResponseOk()
}

希望对您有所帮助!

请注意,在 call() 方法的第二个参数中传递文件参数不起作用。由于第二个参数是负载数据。

如果你把它作为数据传递,当你在后端使用这样的命令时:

if($request->hasFile('my_file')) {
    // Do some logic here
}

$request->hasFile() 将始终 return 错误。

您需要在第 5 个参数中传递假文件上传才能使其有效。

这里是call

的方法签名
call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)

这对我有用。很简单。这样就可以提交文件上传了。

1.condition 无认证

5*1000 是文件大小(以 KB 为单位)。所以我用 5 MB 文件做了一个测试。

use Faker\Factory as Faker;
use Illuminate\Http\UploadedFile;

class SampleTest extends TestCase
{
    public function testItCanCreateUser()
    {
        $faker = Faker::create();
        $files = [
            'file' => UploadedFile::fake()->create('file.jpg', 5*1000)
        ];
        $response = $this->call('POST', '/chunk', [], [], $files);
        $this->assertEquals(200, $response->getStatusCode());
    }
}

2.condition 有身份验证(登录用户)

use Faker\Factory as Faker;
use Illuminate\Http\UploadedFile;

class SampleTest extends TestCase
{
    public function testItCanUpdateProfileUser()
    {
        $faker = Faker::create();
        $files = [
            'file' => UploadedFile::fake()->create('file.jpg', 5*1000)
        ];

        $headers = [
            'Accept' => 'application/json',
            'Authorization' => 'your-jwt-token'
        ];
        $servers = [];
        foreach ($headers as $k => $header) {
            $servers["HTTP_" . $k] = $header;
        }

        $response = $this->call('POST', '/chunk', [], [], $files, $servers);
        $this->assertEquals(200, $response->getStatusCode());
    }
}

您需要在每个请求 header 上添加 HTTP_。我不知道为什么。但它会起作用。