【问题标题】:Can't find Yii2 classes in Codeception test在 Codeception 测试中找不到 Yii2 类
【发布时间】:2015-04-27 12:44:57
【问题描述】:

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


    【解决方案1】:

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

    即在tests/_bootstrap.php内部,附加了以下代码行:

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

    很可能是因为只有在 Application 构造函数中,自动加载器才真正附加到运行时。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        当我遇到这个错误时,我发现我没有所有必要的设置。此错误通常是由于未在 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(_bootstrap.php 在文件夹tests/unit、tests/functional 和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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-16
          • 1970-01-01
          • 2015-03-18
          • 2015-08-14
          • 2019-04-16
          • 2015-07-16
          • 1970-01-01
          • 2018-12-27
          相关资源
          最近更新 更多