Yii2 и Codeception: Stub для Request компонента

Всё про тестирование в Yii 2.0
Ответить
rumasterov
Сообщения: 17
Зарегистрирован: 2013.01.18, 19:00

Yii2 и Codeception: Stub для Request компонента

Сообщение rumasterov »

Всем привет.

Пишу функциональный тест в Codeception, хочу сделать подмену метода getUserIP() компонента Request, для этого создаю Stub и регистрирую его в приложении:

Код: Выделить всё

$requestStub = Stub::make(\yii\web\Request::class, ['getUserIP' => function () { return '192.168.0.10'; }]);
\Yii::$app->set('request', $requestStub); 
Запускаю тест и получаю ошибку:
[yii\base\ErrorException] Undefined index: SCRIPT_FILENAME
Начинаю смотреть подробнее, ошибка появляется в yii2\web\Request.php:

Код: Выделить всё

    public function getScriptFile()
    {
        return isset($this->_scriptFile) ? $this->_scriptFile : $_SERVER['SCRIPT_FILENAME'];
    } 
Пишу error_log внутри этого метода и вывожу в лог содержимое переменной $_SERVER, запускаю функциональный тест и вижу в логе что есть индекс SCRIPT_FILENAME.

Каким образом может получаться такая ошибка, если индекс есть?

Может кто-нибудь стакливался с таким?
Аватара пользователя
ilyar
Сообщения: 9
Зарегистрирован: 2014.09.14, 13:58

Re: Yii2 и Codeception: Stub для Request компонента

Сообщение ilyar »

С воем блоге Vladimir Ivanov рекомендует делать так:

Код: Выделить всё

$request = $this->getMock('\yii\web\Request', ['getUserIP', 'getUserAgent', 'getBodyParams']);
 
$request->expects($this->any())
 ->method('getUserIP')
 ->will($this->returnValue('127.0.0.1'));
 
$request->expects($this->any())
 ->method('getUserAgent')
 ->will($this->returnValue('Dummy User Agent'));
 
$request->expects($this->any())
 ->method('getBodyParams')
 ->will($this->returnValue([]));
 
 
\Yii::$app->set('request', $request);
Источник http://vladimir-ivanov.net/mock-yii2-components/

Из моей практике.
Будет работать так:

Код: Выделить всё

$request = $this->getMock('yii\\web\\Request');
$request->method('enableCsrfValidation')->willReturn(true);
Yii::$app->set('request', $request)
Бывает удобнее замокать приложение целиком:

Код: Выделить всё

$this->mockApplication([
    'components' => [
        'request' => [
            'class' => 'yii\web\Request',
            'enableCsrfValidation' => true,
            'cookieValidationKey' => 'key',
        ],
        'response' => [
            'class' => 'yii\web\Response',
        ],
    ],
]);
Подробности https://github.com/yiisoft/yii2/pull/14220/files
Ответить