Codeception 测试中找不到 Yii2 类

问题描述 投票:0回答:4

我开始在 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');

所以我确信我做错了什么,但我一无所知。

php composer-php yii2 codeception
4个回答
7
投票

我通过在全局 Codeception 引导文件中显式创建 Yii 应用程序解决了这个问题。

也就是在

tests/_bootstrap.php
里面,追加了下面这行代码:

new yii\web\Application(require(__DIR__ . '/../config/test.php'));

很可能是因为只有在

Application
构造函数中,自动加载器才真正附加到运行时。


1
投票

看来,命名空间有什么问题。 这是工作单元测试的示例。您可以尝试类似的方法:声明命名空间并在文件开头写入用途。

<?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');

1
投票

当我遇到这个错误时,我发现我没有进行所有必要的设置。此错误通常是由于未在 Yii2 配置中设置应用程序基本路径而发生的。一步一步:

  1. 检查您是否已启用 Yii2 模块以及

    codeception.yml
    中包含的引导文件:

    paths:
        tests: tests
    <...skipped...>
    settings:
        bootstrap: _bootstrap.php
    modules:
        config:
            Yii2:
                configFile: 'config/test.php'
                cleanup: false
    
  2. 检查您是否拥有用于测试的配置文件 (

    config/test.php
    )(任何其他设置都可以添加到此最小配置中):

    <?php
    
    return [
        'id' => 'prunto-test',
        'basePath' => dirname(__DIR__),
    ];
    
  3. 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');
    
  4. 检查您是否在

    tests/unit.suite
    中启用了 Yii2 模块,如下所示:

    actor: ...
    modules:
        enabled:
            - Asserts
            - Yii2
    
  5. 重建代码接收:

    ./vendor/bin/cept build


0
投票

有同样的问题。通过将“autoload”部分添加到composer.json文件并重建composer自动加载文件来解决:

"autoload": {
    "psr-4": {
        "app\\": "./"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.