правильная настройка AspectMock в Yii2 проекте

Добрый день! Использую GitHub - Codeception/AspectMock: The most powerful and flexible mocking framework for PHPUnit / Codeception. в yii2 проекте (basic шаблон).

Вот мой tests/codeception/_bootstrap.php

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');

defined('YII_TEST_ENTRY_URL') or define('YII_TEST_ENTRY_URL', parse_url(\Codeception\Configuration::config()['config']['test_entry_url'], PHP_URL_PATH));
defined('YII_TEST_ENTRY_FILE') or define('YII_TEST_ENTRY_FILE', dirname(dirname(__DIR__)) . '/web/index-test.php');

require_once(__DIR__ . '/../../vendor/autoload.php');

$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
    'debug' => true,
    'includePaths' => [__DIR__.'/../../filters'],
]);

$kernel->loadFile(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');

$_SERVER['SCRIPT_FILENAME'] = YII_TEST_ENTRY_FILE;
$_SERVER['SCRIPT_NAME'] = YII_TEST_ENTRY_URL;
$_SERVER['SERVER_NAME'] = parse_url(\Codeception\Configuration::config()['config']['test_entry_url'], PHP_URL_HOST);
$_SERVER['SERVER_PORT'] =  parse_url(\Codeception\Configuration::config()['config']['test_entry_url'], PHP_URL_PORT) ?: '80';

Yii::setAlias('@tests', dirname(__DIR__));
Yii::setAlias('@app', dirname(dirname(__DIR__)));
```

Я намеренно включил только директорию filters проекта, т.к. на данный момент мне не нужно мокать другие классы.
Когда запускаю тесты, то получаю:

```
/tests$ codecept run api
Codeception PHP Testing Framework v2.1.4
Powered by PHPUnit 4.8.18 by Sebastian Bergmann and contributors.

Api Tests (1) ------------------------------------------------------------------------------
Try to test (order\GetCest::tryToTest)                                                Ok
--------------------------------------------------------------------------------------------


Time: 831 ms, Memory: 26.50Mb

OK (1 test, 2 assertions)
PHP Fatal error:  Class 'yii\base\UnknownClassException' not found in /var/www/iretail/vendor/yiisoft/yii2/BaseYii.php on line 291
PHP Stack trace:
PHP   1. {main}() /home/kaiser/.composer/vendor/codeception/codeception/codecept:0
PHP   2. Symfony\Component\Console\Application->run() /home/kaiser/.composer/vendor/codeception/codeception/codecept:28
PHP   3. yii\base\ErrorHandler->handleFatalError() /var/www/iretail/vendor/yiisoft/yii2/base/ErrorHandler.php:0
PHP   4. spl_autoload_call() /var/www/iretail/vendor/yiisoft/yii2/base/ErrorHandler.php:231
PHP   5. yii\BaseYii::autoload() /var/www/iretail/vendor/yiisoft/yii2/base/ErrorHandler.php:231
PHP   6. spl_autoload_call() /var/www/iretail/vendor/yiisoft/yii2/base/ErrorHandler.php:291
PHP   7. yii\BaseYii::autoload() /var/www/iretail/vendor/yiisoft/yii2/base/ErrorHandler.php:291
```
Т.е. тест успешно проходит, AspectMock успешно отрабатывает. Но при завершении работы кодеспешена валится ошибка, причем пути к файлам верные.
Может быть я неверно настроил  AspectMock?

Здравствуйте, добавьте вот эту строку после $kernel->loadFile(DIR . ‘/…/…/vendor/yiisoft/yii2/Yii.php’):

$kernel->loadFile(DIR . ‘/…/…/vendor/yiisoft/yii2/base/ErrorException.php’);

Должно помочь.

1 лайк

Да, это помогло, спасибо!