在流明5.5中测试文件上传

时间:2017-09-25 15:13:46

标签: php unit-testing testing lumen

我正在使用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')返回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!";
    }

}

我检查了其他问题(例如this one)并尝试了解决方案但没有运气!

3 个答案:

答案 0 :(得分:1)

我在搜索同一问题的答案时遇到了这个问题,并且不确定它是否相关,所以我提出了一个与我的用例相关的问题。 (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()
}

希望它有所帮助!

答案 1 :(得分:1)

请注意,在call()方法的第二个参数中传递文件参数无效。由于第二个参数是有效载荷数据。

如果将其作为数据传递,则在后端使用如下命令时:

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

$request->hasFile()将始终返回false。

您需要在第5个参数中传递伪造的文件上传,以使此功能生效。

这是call的方法签名

call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)

答案 2 :(得分:1)

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

1。未经身份验证的条件

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。带有身份验证的条件(已登录用户)

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());
    }
}

您需要在每个请求标头上添加HTTP_。我不确定为什么。但是会起作用。