CakePHP IntegrationTestTrait, загрузка файла тестирования - PullRequest
0 голосов
/ 04 октября 2019

Я застрял на этом в течение нескольких дней! Я пытаюсь протестировать функцию контроллера, которая читает файл, загруженный в $ _FILES, и устанавливает переменную, содержащую сообщения об ошибках / успехах.

Я знаю, что 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 не может прочитать поток». Однако, когда я изменяю name на неверное имя файла, кажется, что нет разницы в выводе.

Кто-нибудь знает, как я могу отладить это дальше?

1 Ответ

0 голосов
/ 15 октября 2019

Я понял, что случилось. Оказывается, я не был самоуверенным.

Я добавил и токен аутентификации и загрузил светильники:

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'); 

...