首页 > 解决方案 > 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
}
...

但我的身份对象总是空的。

空标识对象

该对象实际上应该如下所示:

带有数据的原始对象

我没有更多的想法如何实施它。有人能帮我吗?:)

标签: phpauthenticationcakephpphpunitcakephp-4.x

解决方案


使用身份验证插件,用户默认存储为对象,如果您传递的对象不是实现的对象\ArrayAccess,那么身份验证服务会将给定数据包装在\ArrayObject.

此外,默认情况下,数据预计将存储在Authkey 中,而不是Auth.User.

理论上传递数组数据也应该有效(如“被视为经过身份验证并在身份对象中设置数据”),即使嵌套在附加密钥中(除非您启用identify了会话身份验证器的选项),所以也许有代码中某处的其他问题,数组对象中有类似storage和的键的事实_config真的很奇怪,这不应该在开箱即用的设置中发生。

无论如何,通常你会使用这样的身份验证进行测试:

$user = $this->Users->get(1);
$this->session(['Auth' => $user]);

也可以看看


推荐阅读