PHPUnit 测试中 Yii2 中的模拟视图助手
Mock view helper in Yii2 in PHPUnit test
我想在 Yii2 框架中测试一个特定的控制器动作。此操作呈现使用助手 yii\helpers\Url 的视图文件:
Url::toRoute('page')
当单元测试调用这个视图时出现错误:
yii\base\InvalidArgumentException: Unable to resolve the relative route: vendor/bin/. No active controller is available.
测试:
<?php
use app\modules\user\controllers\UserController;
class UserControllerTest extends \PHPUnit_Framework_TestCase
{
public function testActionIndex() {
Yii::configure(Yii::$app, [
'components' => [
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'app\modules\user\models\User',
],
'request' => [
'class' => 'yii\web\Request',
'cookieValidationKey' => 'abc',
],
],
]);
$controller = new UserController('user', Yii::$app);
$result = $controller->run('index', []);
}
}
如何模拟方法 Url::toRoute 以避免此错误?
Url
助手使用 Yii::$app->controller
来解析相对路由。在调用操作之前,您需要设置 Yii::$app->controller
:
Yii::$app->controller = new UserController('user', Yii::$app);
$result = Yii::$app->controller->run('index', []);
或者,您可以使用绝对路由来避免此问题:
Url::toRoute('/mymodule/mycontroller/page');
虽然不太实用,因为你需要在很多地方重复同一条路线。
我想在 Yii2 框架中测试一个特定的控制器动作。此操作呈现使用助手 yii\helpers\Url 的视图文件:
Url::toRoute('page')
当单元测试调用这个视图时出现错误:
yii\base\InvalidArgumentException: Unable to resolve the relative route: vendor/bin/. No active controller is available.
测试:
<?php
use app\modules\user\controllers\UserController;
class UserControllerTest extends \PHPUnit_Framework_TestCase
{
public function testActionIndex() {
Yii::configure(Yii::$app, [
'components' => [
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'app\modules\user\models\User',
],
'request' => [
'class' => 'yii\web\Request',
'cookieValidationKey' => 'abc',
],
],
]);
$controller = new UserController('user', Yii::$app);
$result = $controller->run('index', []);
}
}
如何模拟方法 Url::toRoute 以避免此错误?
Url
助手使用 Yii::$app->controller
来解析相对路由。在调用操作之前,您需要设置 Yii::$app->controller
:
Yii::$app->controller = new UserController('user', Yii::$app);
$result = Yii::$app->controller->run('index', []);
或者,您可以使用绝对路由来避免此问题:
Url::toRoute('/mymodule/mycontroller/page');
虽然不太实用,因为你需要在很多地方重复同一条路线。