如何在功能测试中将值设置为$ _SERVER ['var']?

时间:2018-06-22 22:07:47

标签: php testing yii2 functional-testing codeception

我有一个动作要根据系统从std::string获取的ID进行“自动登录”。在我的业务服务器中,始终为经过身份验证的用户设置 的值。现在,我正在尝试测试我的自动登录(以及许多其他依赖自动登录的工作),因此我需要将一些用户设置为该全局用户(只是一个字符串)。

我尝试过的事情

$_SERVER['AUTH_USER']

但是,加载自动登录操作后,该值不再位于$ _SERVER全局变量中,并且我的测试崩溃。

我想知道的事情

我可以在哪里或如何设置该全局值,以便页面可以正常工作,读取该值并继续操作。

我将不胜感激。 谢谢。

2 个答案:

答案 0 :(得分:2)

似乎缺乏适当的抽象。您应该避免直接在您的应用中访问$_SERVER['AUTH_USER'],并且最多只能在一个位置进行操作-在将为此提供抽象的组件中。因此,您应该扩展yii\web\Request并为$_SERVER['AUTH_USER']抽象添加相关方法:

class MyRequest extends \yii\web\Request {

    private $_myAuthUser;

    public function getMyAuthUser() {
        if ($this->_myAuthUser === null) {
            $this->_myAuthUser = $_SERVER['AUTH_USER'];
        }

        return $this->_myAuthUser;
    }

    public function setMyAuthUser($value) {
        $this->_myAuthUser = $value;
    }
}

在配置中使用新类:

return [
    'id' => 'app-web',
    // ...
    'components' => [
        'request' => [
            'class' => MyRequest::class,
        ],
        // ...
    ],
];

并在操作中使用抽象:

$authUser = explode('\\', Yii::$app->request->getMyAuthUser())[0];

在测试中,您可以使用MyRequest中的setter来设置值:

 Yii::$app->request->setMyAuthUser('domain\x12345');

或在配置级别进行配置:

return [
    'id' => 'app-test',
    // ...
    'components' => [
        'request' => [
            'class' => MyRequest::class,
            'myAuthUser' => 'domain\x12345',
        ],
        // ...
    ],
];

更新:

根据 slinstj 注释,Codeception可能会失去request组件的状态,包括myAuthUser值。在这种情况下,最好在不同的组件(例如getMyAuthUser())上实现setMyAuthUser()Yii::$app->user或为此创建单独的组件:

return [
    'id' => 'app-web',
    // ...
    'components' => [
        'authRequest' => [
            'class' => MyRequest::class,
        ],
        // ...
    ],
];

答案 1 :(得分:0)

目前,我正在使用一种变通方法,因为只有一个地方可以检查该变量值:

//Inside my action autologin:
$authUser = explode('\\', ($_SERVER['AUTH_USER'] ?? (YII_ENV_TEST ? 'domain\x12345' : 'domain\xInvalid')))[1];

此处唯一相关的点是YII_ENV_TEST,即测试时的true。我可以使用它设置一个足以满足该简单测试要求的特定值。

不过,我希望在这里看到其他更好的主意! 谢谢。