如何对需要 HTTP 基本身份验证的 CakePHP 3.x 控制器操作进行单元测试?

How to unitTest CakePHP 3.x Controller Actions that require HTTP Basic Authentication?

我正在尝试通过将 PHP_AUTH_USERPHP_AUTH_PW 添加到 $_ENV-Variable 来验证用户身份,但这没有任何影响。我将以下配置与 memory-Storage:

一起使用
$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-Header...

$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
    ],        
];

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

集成测试用例不应该 fiddle 与超全局变量,因为它们通常不会被测试用例触及,以避免非 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();                         
}

另见