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.