如何unitTest CakePHP 3.x控制器需要HTTP基本身份验证的操作?

时间:2016-05-19 11:21:58

标签: unit-testing cakephp basic-authentication cakephp-3.x cakephp-3.2

我正在尝试通过将PHP_AUTH_USERPHP_AUTH_PW添加到$_ENV - 变量来对用户进行身份验证,但这没有任何影响。我使用以下配置memory - 存储:

$this->loadComponent('Auth', [
        'authenticate' => [
            'Basic' => [
                'fields' => ['username' => 'username', 'password' => 'password'],
                'userModel' => 'CmUsers'
            ],
        ],
        'storage' => 'Memory',
        'unauthorizedRedirect' => false
]);  

测试因exception 'Cake\Network\Exception\UnauthorizedException' with message 'Unauthorized'而失败。

public function testIndex()
{         
    $_ENV['PHP_AUTH_USER'] = 'ApiUser';  
    $_ENV['PHP_AUTH_PW'] = '123456';   

    $this->get('/index');                

    $this->assertResponseOk();                         
}

有没有人知道如何将身份验证数据添加到请求中?

如果我遵循@ndm的建议并添加Authentication - 标题......

$this->configRequest([
            'environment' => [
                'PHP_AUTH_USER' => 'ApiUser',
                'PHP_AUTH_PW' => '123456',                  
            ],
            'headers' => ['Authorization' => 'Basic ApiUser:123456']
]); 

......环境变量看起来像这样:

[_environment:protected] => Array
    (
        [HTTP_AUTHORIZATION] => Basic ApiUser:123456
        [REQUEST_METHOD] => GET
        [PHP_AUTH_USER] => ApiUser
        [PHP_AUTH_PW] => 123456
        [HTTP_X_HTTP_METHOD_OVERRIDE] => 
        [ORIGINAL_REQUEST_METHOD] => GET
        [SERVER_PORT] => 
        [HTTPS] => 
        [HTTP_HOST] => 
    )

我的灯具看起来像这样:

public $records = [
    [
        'id' => 2,
        'username' => 'ApiUser',
        'password' => '123456',
        'role' => 'api-user',
        'created' => 1460710056,
        'modified' => 1460710056
    ],        
];

不幸的是,请求仍然被阻止。

1 个答案:

答案 0 :(得分:2)

集成测试用例不应该使用超级全局,因为它们通常不会被测试用例触及,以避免使用非CakePHP请求相关数据污染测试环境。

可以通过\Cake\TestSuite\IntegrationTestCase::configRequest()方法配置测试请求。它接受一个数组,它基本上只传递给测试使用的请求对象的\Cake\Network\Request构造函数。

长话短说,可以通过environment配置键定义环境变量,例如

public function testIndex()
{
    $this->configRequest([
        'environment' => [
            'PHP_AUTH_USER' => 'ApiUser',
            'PHP_AUTH_PW' => '123456'
        ]
    ]);  

    $this->get('/index');                

    $this->assertResponseOk();                         
}

另见