我正在尝试为期望带有附加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/

10-15 07:56