我正在使用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)并尝试了解决方案但没有运气!
答案 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_
。我不确定为什么。但是会起作用。