PHPUnit CakePHP 4.X - 模拟身份 object,但怎么做?

PHPUnit CakePHP 4.X - mock up the identity object, but how?

我用 cakephp 编写了一个网络应用程序 4.x。在我的控制器(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
}
...

但是我的身份object一直是空的。

object 实际上应该是这样的:

我不知道如何实施它。有人能帮我吗? :)

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

此外,数据默认存储在 Auth 键,而不是 Auth.User

理论上传递数组数据也应该有效(如“被视为经过身份验证且数据被设置在身份对象中”),即使嵌套在附加键中(除非您启用了 identify会话身份验证器的选项),因此您的代码中可能存在其他问题,数组对象中存在 storage_config 之类的键这一事实真的很奇怪,这不应该发生在输出中盒子设置。

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

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

另见