php - PHPUnit CakePHP 4.X - 模拟身份对象,但如何?
问题描述
我用 cakephp 4.x 写了一个 webaplication。在我的控制器(AppController.php)中,我实现了以下内容:
...
public function beforeRender(\Cake\Event\EventInterface $event)
{
#Load User_ID
if($this->Authentication->getIdentity()){
$identity = $this->Authentication->getIdentity();
$user_id = $this->Authentication->getIdentity()->getIdentifier();
}
}
...
现在我编写了以下phpunit测试:
...
private function loginAsAdmin() {
$this->Users = TableRegistry::getTableLocator()->get('Users');
$user = $this->Users->get(1);
$this->session(['Auth.User'=> $user->toArray()]);
}
/**
* Test loginAsUser method
*
* @return void
*/
public function testLoginAsAdmin(): void
{
$this->loginAsAdmin();
$this->get('/admin/dashboard');
$this->assertSession(1, 'Auth.User.id'); //check if the user is logged in
}
...
但我的身份对象总是空的。
该对象实际上应该如下所示:
我没有更多的想法如何实施它。有人能帮我吗?:)
解决方案
使用身份验证插件,用户默认存储为对象,如果您传递的对象不是实现的对象\ArrayAccess
,那么身份验证服务会将给定数据包装在\ArrayObject
.
此外,默认情况下,数据预计将存储在Auth
key 中,而不是Auth.User
.
理论上传递数组数据也应该有效(如“被视为经过身份验证并在身份对象中设置数据”),即使嵌套在附加密钥中(除非您启用identify
了会话身份验证器的选项),所以也许有代码中某处的其他问题,数组对象中有类似storage
和的键的事实_config
真的很奇怪,这不应该在开箱即用的设置中发生。
无论如何,通常你会使用这样的身份验证进行测试:
$user = $this->Users->get(1);
$this->session(['Auth' => $user]);
也可以看看
推荐阅读
- docker - 团队如何在同一个云应用程序上工作
- go - 为什么 binary.Read() 不适用于结构?
- highcharts - 在一个容器中使用多个饼图时如何对齐高图图例?
- javascript - tab更改彻底的jQuery脚本正在工作,但当Tab结构更改为响应式标签(R-TAB结构)时不起作用
- mysql - MySQl/Laravel:在更新记录之前检查更改的列
- mpi - 如何检测 MPI_Request 对象是否由 MPI_Isend 或 MPI_Send_init 启用?
- javascript - 将 v-model 作为数组传递给组件时 Vue js 出现问题?
- sql - PostgreSQL:使用 join 和 group by 查询花费的时间太长
- javascript - 如何检测元素是否有 ::after(伪元素)?
- r - 无法转换包含数据框的列表