我正在尝试为期望带有附加CSV文件的发布请求的端点编写测试。我知道可以像这样模拟发布请求:
$this->post('/foo/bar');
但是我不知道如何添加文件数据。我尝试手动设置
$_FILES
数组,但没有成功...$_FILES = [
'csvfile' => [
'tmp_name' => '/home/path/to/tests/Fixture/csv/test.csv',
'name' => 'test.csv',
'type' => 'text/csv',
'size' => 335057,
'error' => 0,
],
];
$this->post('/foo/bar');
什么是正确的方法?
最佳答案
模拟核心PHP函数有些棘手。
我猜您的帖子模型中有类似的内容。
public function processFile($file)
{
if (is_uploaded_file($file)) {
//process the file
return true;
}
return false;
}
这样您就有了相应的测试。
public function testProcessFile()
{
$actual = $this->Posts->processFile('noFile');
$this->assertTrue($actual);
}
由于您在测试过程中未上传任何内容,因此测试将始终失败。
您应该在PostsTableTest.php的开头添加第二个 namespace ,即使在单个文件中包含更多 namespace 也是一个坏习惯。
<?php
namespace {
// This allows us to configure the behavior of the "global mock"
// by changing its value you switch between the core PHP function and
// your implementation
$mockIsUploadedFile = false;
}
比起原始的 namespace 声明,应该使用大括号格式。
namespace App\Model\Table {
您可以添加要覆盖的PHP核心方法
function is_uploaded_file()
{
global $mockIsUploadedFile;
if ($mockIsUploadedFile === true) {
return true;
} else {
return call_user_func_array('\is_uploaded_file',func_get_args());
}
}
//other model methods
} //this closes the second namespace declaration
有关CakePHP单元测试的更多信息,请点击此处:http://www.apress.com/9781484212134
关于php - CakePHP/phpunit : how to mock a file upload,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39541273/