gpt4 book ai didi

拉拉维尔 5.2 |测试 UploadedFile 在发布后缺少 $test 值。漏洞?

转载 作者:行者123 更新时间:2023-12-02 05:35:11 27 4
gpt4 key购买 nike

更新 2016/04/26 11:30 GMT+2 解决方法

从 Laravel 5.2.15 开始,$test 参数被移除,但是没有明确的原因,因为 Symfony 的 UploadedFile 仍然有 $test 参数。

解决方法是暂时使用 Laravel 5.2.14。

更新2016/04/26 11:00 GMT+2

Laravel 自己的 UploadedFile 没有传递 $test 参数。请参阅这些资源:

我知道,还有一个问题:How to test file upload in Laravel 5.2 ,但标记的答案对我不起作用。

测试用例

我创建了 Symfony 的 UploadedFile 类的实例,并将 $test 设置为 true。我将文件发布到 file/upload

class FileControllerTest extends TestCase
{
use \Illuminate\Foundation\Testing\DatabaseTransactions;

private $file;

public function setUp()
{
parent::setUp();

$this->file = new Symfony\Component\HttpFoundation\File\UploadedFile(
public_path() . '/examples/example.jpg',
'example.jpg',
'image/jpeg',
filesize(public_path() . '/examples/example.jpg'),
null,
true // for $test
);
}

/** @test */
public function it_uploads_a_valid_file()
{
var_dump($this->file); // $test = true
$this->call('POST', 'file/upload', [], [], ['file' => $this->file],
['accept' => 'application/json']);

$this->assertResponseOk();
}
}

Controller

namespace App\Http\Controllers;

class FileController extends Controller
{
public function upload(Request $request)
{
var_dump($request->file('file')); // $test = false

return [];
}
}

问题

  • 要发布的文件的 $test 参数为 true
  • 发布的文件到达upload()
  • $request->file('file') 包含正确的参数,但是

    $test

看来参数 $test 没有被 post 调用过去。这是一个错误吗?

最佳答案

说明

这真是一件有趣的事情。在创建这篇文章时,您已经注意到了很多(如果有人有问题,请仔细阅读)。

在此commit正如您已经提到的 $testing 参数已删除,并且类的代码已简化,删除了 Reflection 以获取 Symfony\Component\HttpFoundation\File\UploadedFile< 的 testing 属性值.

现在棘手的事情是,根据您正在测试的内容,您可能不会注意到更改,并且一切可能会正常工作,但在某些情况下却不会,您也不会真正知道原因。

例如,一切都可能正常 - 文件上传不会有问题,但如果您将 mimes 规则添加到 Request 类中,如下所示:

'logo' => ['mimes:jpeg,png'],

它不会告诉您文件具有无效的 mime(这是因为在内部它也会验证文件是否确实上传,并且在测试时实际上它与真实上传不一样)。

解决方案是再次查看提交中真正更改的内容以及该方法的外观。在 this file上传文件的实例返回如下:

 return $file instanceof static ? $file : new static(
$file->getRealPath(), $file->getClientOriginalName(), $file->getClientMimeType(),
$file->getClientSize(), $file->getError()
);

因此,如果文件是此类的实例,它将返回未修改的实例,否则它将创建 now 对象,而不将 $testing 参数传递给类构造函数。

解决方案

因此,要解决此问题,在测试文件上传时,您不应使用

\Symfony\Component\HttpFoundation\File\UploadedFile

下课了。您现在应该使用

\Illuminate\Http\UploadedFile

在测试文件上传时不会出现任何奇怪的问题(当然,您仍然应该将 true 作为 $testing 参数传递给此对象构造函数,但现在它将是稍后使用没有问题)

关于拉拉维尔 5.2 |测试 UploadedFile 在发布后缺少 $test 值。漏洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36857800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com