CakePHP IntegrationTestTrait,测试文件上传

CakePHP IntegrationTestTrait, Testing File Upload

我已经卡在这个问题上好几天了!我正在尝试测试一个控制器函数,该函数读取在 $_FILES 中上传的文件并设置一个包含 error/success 消息的变量。

我知道 CakePHP IntegrationTestTrait 实际上不会发送 HTTP 请求,但是,我发现有人声称他们可以绕过它:

我已尝试实施我在此处找到的以下解决方案: https://discourse.cakephp.org/t/unit-testing-of-file-uploads-solved/5241

但问题依然存在

Controller/StudentsController.php

public function import() {
        if ($this->request->is('post')) {
                .
                .
                . 

                $import = $this->Students->import($this->request->getData('CsvFile.tmp_name'));

                if (! empty($import['errors'])) {
                   $this->Flash->error($error);
                } else {
                    $this->set('import', $import);
                }
       }
}

这是我使用 IntegrationTestTrait 的测试用例。

public function testImport() {

        // Append a bad file (wrong type) by spoofing PHP's files array
        $_FILES = [
            'CsvFile' => [
                'name'     => 'student-import-test-1.csv',
                'type'     => 'text/csv',
                'tmp_name' => 'tests/Fixture/csv/',
                'error'    => 0,
                'size'     => 258
            ]
        ];

        $data = [
            'CsvFile.name'     => 'student-import-test-1.csv',
            'CsvFile.type'     => 'text/csv',
            'CsvFile.tmp_name' => 'tests/Fixture/csv/',
            'CsvFile.error'    => 0,
            'CsvFile.size'     => 258
        ];

        $this->post('/students/import', $data);

        $this->assertResponseOk();
        $this->assertFlashElement('Flash/error');

        $_FILES = [];
    }

$this->assertResponseOk() 失败,因为 Failed asserting that 302 is between 200 and 204. 但是,$this->assertFlashElement('Flash/error') 是成功的。

我是 CakePHP 测试新手。我一直在调试这个问题。我认为有几件事可能会造成这种情况

tmp_name/ 文件可能无法访问。我尝试将 tmp_name 更改为不正确的路径,但收到 "PSD cannot read stream" 错误。但是,当我将 name 更改为不正确的文件名时,输出似乎没有差异。

有谁知道我该如何进一步调试它?

我知道出了什么问题。事实证明我没有验证自己。

我添加了身份验证令牌并加载了固定装置:

public funciton setUp() {

        // Configure Authentication
        $this->session([
            'Auth' => [
                'User' => [
                    'id' => 21896, /* Insert Test User Info */
                    'is_admin' => false /* Insert Test User Info */
                ]
            ]
        ]);

      // Load Fixtures necessary for User authentication 
      $this->loadFixtures('Users', 'Permissions');