PHPUnit тестирует действие добавления - Ошибка теста - PullRequest
0 голосов
/ 05 июня 2018

CakePHP Версия: 3.5.17PHPUnit: 6.5.8

Пример кода:

Пользовательский контроллер add action.(Код ошибки).

public function add()
{
    $user = $this->Users->newEntity();
    if ($this->request->is('post')) {

        // Initialise the client id.  
        if ($this->clientId() === false) {
            //$errorLocation = 'Users Controller - Line ' .  __LINE__;
            //if ($this->recordError($errorLocation) === false) {
                //throw new UnauthorizedException();
            //}
            //throw new UnauthorizedException();  
        }
        else {
           $clientID = $this->clientId(); 
        } 

        $user = $this->Users->patchEntity($user, $this->request->getData());

        // Declare the client id for save.
        $user->cid_1 = $clientID;

        if ($this->Users->save($user)) {
            $this->Flash->success(__('The user has been saved.'));
            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The user could not be saved. Please, try again.'));
    }
}

Функция идентификатора клиента.

public function clientId()
{
    $session = $this->request->session();
    if ($session->check('Cid.one')) {
        $clientID = $session->read('Cid.one');
        if (!is_string($clientID) || is_numeric($clientID) || (strlen($clientID) !== 40)) {
            return false;
        }
        return $clientID;
    }
    return false;
}

Процесс.

Когда пользователь входит в систему, я выбираю $ clientID, сохраняю его в сеансе и использую его во многих моих операторах выбора в приложении.

Ошибка .

Неопределенная переменная clientID - EG: Идентификатор клиента не извлекается из функции, ошибки которой при сохранении.

Сводка.

Это имеет смысл для меня, потому что яможет выполнить модульное тестирование без входа в систему и получения идентификатора клиента при входе в систему.Например: как может быть идентификатор клиента при тестировании!

Мое решение.

Вместо сеанса я использую поиск, как показано ниже.

Пользовательский контроллер добавить действие.(Код, который проходит.)

public function add()
{
    $user = $this->Users->newEntity();
    if ($this->request->is('post')) {

        // Declare the id from auth component.
        $id = $this->Auth->user('id');

        // Select the client id. 
        $query = $this->Users->find('cid', [
            'id' => $id
        ]);

        if ($query->isEmpty()) {
            $errorLocation = 'Users Controller - Line ' .  __LINE__;
            if ($this->recordError($errorLocation) === false) {
                throw new NotFoundException();
            }
            throw new NotFoundException();
        }

        // Initialise the variables and retrieve the data.
        $clientID = '';
        foreach ($query as $row):                           
           $clientID = $row->cid_1;
        endforeach;

        $user = $this->Users->patchEntity($user, $this->request->getData());

        // Declare the client id for save.
        $user->cid_1 = $clientID;

        if ($this->Users->save($user)) {
            $this->Flash->success(__('The user has been saved.'));
            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The user could not be saved. Please, try again.'));
    }
}

Мой вопрос:

Есть ли способ смоделировать $ clientID из сеанса для теста?

Мне было интересно, было ли что-то похожее на использование: $ this-> session (['Auth.User.id' => 1400]);в моем тесте, который имитирует аутентифицированного пользователя, но для других данных сеанса, таких как идентификатор клиента?

Почему я спрашиваю.

Это связано с производительностью.Насколько я знаю, быстрее объявить значение из сеанса, чем выбрать значение из базы данных.

Спасибо Z.

1 Ответ

0 голосов
/ 06 июня 2018

В разделе руководства по Тестирование действий, требующих аутентификации показано, как устанавливать переменные в сеансе.Но это не ограничивается только разделом Auth;в своем тестовом коде вы можете установить любые необходимые переменные сеанса.В вашем случае:

$this->session(['Cid.one' => XXX]);
...