我开始在 Yii2 中使用 Codeception 进行单元测试。太好了,Yii2 现在完全接受了它,这是我升级的主要原因!
我在让 Codeception 找到课程时遇到困难。我编写的控制器类,例如这些类通过在 Yii2 应用程序中自动加载来正常加载。
例如这个控制器:
<?php
class RecipeControllerTest extends \Codeception\TestCase\Test
{
/**
* @var \UnitTester
*/
protected $tester;
protected function _before()
{
}
protected function _after()
{
}
// tests
public function testMe()
{
echo \app\controllers\RecipesController::getallrecipes();
}
}
当我在控制台中执行
codeception run unit
时的结果:
致命错误。测试尚未完成。
找不到类“
”app\controllers\RecipesController
我的
_bootstrap.php
文件包含以下内容:
require_once(__DIR__ . '/../../vendor/autoload.php');
require_once(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
所以我确信我做错了什么,但我一无所知。
我通过在全局 Codeception 引导文件中显式创建 Yii 应用程序解决了这个问题。
也就是在
tests/_bootstrap.php
里面,追加了下面这行代码:
new yii\web\Application(require(__DIR__ . '/../config/test.php'));
很可能是因为只有在
Application
构造函数中,自动加载器才真正附加到运行时。
看来,命名空间有什么问题。 这是工作单元测试的示例。您可以尝试类似的方法:声明命名空间并在文件开头写入用途。
<?php
namespace api\tests\unit\modules\v1\models;
use yii;
use api\tests\unit\DbTestCase;
use api\modules\v1\models\BaseModel;
class BaseModelTest extends DbTestCase {
protected function _before()
{
}
protected function _after()
{
}
public function testGetSettingsValue() {
$model = new BaseModel('project');
$value = $model->getSettingsValue('MIN_BALANCE_FOR_OUT');
verify($value)->equals(1000);
}
}
另外,我的引导文件有一行
require(__DIR__ . '/../../common/config/aliases.php');
在别名中声明别名
Yii::setAlias('common', dirname(__DIR__));
Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console');
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
当我遇到这个错误时,我发现我没有进行所有必要的设置。此错误通常是由于未在 Yii2 配置中设置应用程序基本路径而发生的。一步一步:
检查您是否已启用 Yii2 模块以及
codeception.yml
中包含的引导文件:
paths:
tests: tests
<...skipped...>
settings:
bootstrap: _bootstrap.php
modules:
config:
Yii2:
configFile: 'config/test.php'
cleanup: false
检查您是否拥有用于测试的配置文件 (
config/test.php
)(任何其他设置都可以添加到此最小配置中):
<?php
return [
'id' => 'prunto-test',
'basePath' => dirname(__DIR__),
];
在
tests/_bootstrap.php
中包含Yii2(文件夹tests/unit中的_bootstrap.php
,tests/功能性和tests/acceptance可以为空):
<?php
define('YII_ENV', 'test');
defined('YII_DEBUG') or define('YII_DEBUG', true);
require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
require __DIR__ .'/../vendor/autoload.php';
// add the custom namespaces here if they are not added in the config files:
// Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend');
// Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend');
检查您是否在
tests/unit.suite
中启用了 Yii2 模块,如下所示:
actor: ...
modules:
enabled:
- Asserts
- Yii2
重建代码接收:
./vendor/bin/cept build
有同样的问题。通过将“autoload”部分添加到composer.json文件并重建composer自动加载文件来解决:
"autoload": {
"psr-4": {
"app\\": "./"
}
}