如何对需要 HTTP 基本身份验证的 CakePHP 3.x 控制器操作进行单元测试?
How to unitTest CakePHP 3.x Controller Actions that require HTTP Basic Authentication?
我正在尝试通过将 PHP_AUTH_USER
和 PHP_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();
}
另见
我正在尝试通过将 PHP_AUTH_USER
和 PHP_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();
}
另见