在 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_
。我不知道为什么。但它会起作用。
我使用的是 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_
。我不知道为什么。但它会起作用。