2015-04-27 50 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