Не удается найти классы Yii2 в тесте Codeception

Я начинаю использовать Codeception для модульного тестирования в Yii2. Здорово, что теперь 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');

Так что я уверен, что делаю что-то не так, но я не знаю.


person Alex Greve    schedule 27.04.2015    source источник


Ответы (3)


Я решил эту проблему, явно создав приложение Yii в глобальном загрузочном файле Codeception.

То есть внутри tests/_bootstrap.php добавлена ​​следующая строка кода:

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

Скорее всего, это потому, что только в конструкторе Application автозагрузчики фактически подключаются к среде выполнения.

person hijarian    schedule 04.01.2017

Кажется, какая проблема с пространствами имен. Это пример рабочего модульного теста. Можно попробовать по аналогии: объявить namespace и написать uses в начале файла.

<?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');
person Nick    schedule 29.04.2015

Когда я встретил эту ошибку, я обнаружил, что у меня нет всех необходимых настроек. Эта ошибка обычно возникает из-за того, что не указан базовый путь приложения в конфигурации 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. Восстановить кодировку: ./vendor/bin/cept build

person AVKurov    schedule 15.01.2018