cakephp 3 undefined 属性 cookie 组件单元测试

cakephp 3 undefined property cookie component unit test

我试图通过单元测试来测试我的组件功能。 我的组件功能如下

public function userRole() { 

    $loginId = $this->Cookie->read('Admin.login_id');
    $name = $this->Cookie->read('Admin.name'); 
    $role = $this->Cookie->read('Admin.role'); 
    if (empty($loginId) || empty($name)){ 
        return false; 
    }

    $adminsORM = TableRegistry::get('Admins');
    $admin = $adminsORM->find('all', [
        'conditions' => ['login_id' => $loginId, 'name' => $name, 'disable' => 0]
    ])->first(); 



    return empty($admin)? false : $admin->role; 
}

下面是我的组件测试功能

public $Acl;

public function setUp()
{
    parent::setUp();
    $registry = new ComponentRegistry();
    $this ->Acl = new AclComponent($registry);
}

public function testUserRole()
{
    // Test our adjust method with different parameter settings       
        $this->Cookie->write('Admin.login_id', 'demo12');
        $this->Cookie->write('Admin.role', 1);        
        $this->Cookie->write('Admin.name', 'demo 12');   
    $output = $this->Acl->userRole();
    $this->assertResponseOk();

}

作曲家测试代码

vendor/bin/phpunit --filter testUserRole /d/xampp/htdocs/admin/admin/tests/TestCase/Controller/Component/AclComponentTest.php

错误

Notice Error: Undefined property: App\Test\TestCase\Controller\Component\AclComponentTest::$Cookie in [D:\xampp\htdocs\admin\admin\tests\TestCase\Controller\Component\AclComponentTest.php, line 31]

基于testing documentation,为了在测试用例期间设置cookie,您需要使用函数$this->cookieEncrypted('my_cookie', 'Some secret values'):

$this->cookieEncrypted('Admin.login_id', 'demo12');
$this->cookieEncrypted('Admin.role', 1);        
$this->cookieEncrypted('Admin.name', 'demo 12');  

如错误所示,您的单元测试中没有 $this->Cookie 属性。我只能假设您组件中的 $this->Cookie 指的是 Cookie 组件(顺便说一句,自 CakePHP 3.5 起已弃用)。

如果您需要为常规单元测试准备 cookie,而不是 controller/integration 测试(您可以在其中使用 IntegrationTestCase::cookie()IntegrationTestCase::cookieEncrypted()IntegrationTestCase::assertResponseOk()方法),那么您必须将 cookie 直接写入请求对象,并确保您将其提供给组件。

查看 Cookbook 中关于如何测试组件的示例,它应该看起来像这样:

namespace App\Test\TestCase\Controller\Component;

use App\Controller\Component\MyComponent;
use Cake\Controller\Controller;
use Cake\Controller\ComponentRegistry;
use Cake\Http\ServerRequest;
use Cake\Http\Response;
use Cake\TestSuite\TestCase;

class MyComponentTest extends TestCase
{
    public $component = null;
    public $controller = null;

    public function setUp()
    {
        parent::setUp();

        $request = new ServerRequest();
        $response = new Response();

        $this->controller = $this->getMockBuilder('Cake\Controller\Controller')
            ->setConstructorArgs([$request, $response])
            ->setMethods(null)
            ->getMock();

        $registry = new ComponentRegistry($this->controller);
        $this->component = new MyComponent($registry);
    }

    // ...
}

然后您可以在 setUp() 方法中定义 cookie,以便它们在所有测试中可用,或者您可以在每个测试中单独定义它们。另请注意,如果您使用的是加密 cookie,则应使用 CookieCryptTrait::_encrypt() 来加密 cookie 数据。

// ...
use Cake\Utility\CookieCryptTrait;
use Cake\Utility\Security;

protected function _getCookieEncryptionKey()
{
    // the cookie component uses the salt by default
    return Security::getSalt();
}

public function testUserRole()
{
    $data = [
        'login_id' => 'demo12',
        'role' => 1,
        'name' => 'demo 12'
    ];
    // the cookie component uses `aes` by default
    $cookie = $this->_encrypt($data, 'aes');

    $request = new ServerRequest([
        'cookies' => [
            'Admin' => $cookie
        ]
    ]);
    $this->controller->request = $request;

    $output = $this->Acl->userRole();
    $this->assertEquals('expected value', $output);
}

另见