2015-04-27 51 views
2

我开始在Yii2中使用Codeception进行单元测试。伟大的Yii2现在完全拥抱它,这是我升级的主要原因!在Codeception测试中找不到Yii2类

让Codeception找到类我有困难。我写过的控制器类,例如这些类在Yii2应用程序中通过自动加载进行加载。

E.g.此控制器:

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

所以,我相信,我做错了什么,但我无言以对。

回答

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

我通过明确创建全球Codeception引导文件中Yii应用解决了这个问题。

也就是说,里面tests/_bootstrap.php,追加下面的代码行:

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

大多数可能是因为只有在Application构造函数中自动加载机被实际连接到运行。

0

当我遇到这个错误,我发现我没有所有必要的设置。此错误通常是由于未在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文件夹中的测试/单元,测试/功能和测试/验收可以为空):

    <?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. 检查您是否启用Yii2模块tests/unit.suite这样的:

    actor: ... 
    modules: 
        enabled: 
         - Asserts 
         - Yii2 
    
  5. 重建codeception :./vendor/bin/cept build