在Codeception与Yii2框架中AspectMock无法正常工作的问题
AspectMock模拟静态方法失效的修复方案
核心问题:类加载顺序错误
你的tests/_bootstrap.php中先加载了Yii.php,这会导致Yii的类自动加载器提前加载Settings类,AspectMock的切面代理无法拦截已加载的类,最终导致模拟失效。
修复步骤
1. 调整bootstrap文件的加载顺序
将autoload.php移到Yii.php之前加载,确保AspectMock的自动加载器优先注册,拦截类加载过程:
<?php define('YII_ENV', 'test'); defined('YII_DEBUG') or define('YII_DEBUG', true); // 先加载Composer自动加载器,让AspectMock优先处理类加载 require __DIR__ . '/../vendor/autoload.php'; // 再加载Yii核心文件 require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $kernel = \AspectMock\Kernel::getInstance(); $kernel->init([ 'debug' => true, 'includePaths' => [__DIR__ . '/../models'], 'appDir' => __DIR__ . '/..', 'excludePaths' => [__DIR__, '/../vendor/codeception', '/../vendor/phpunit'], 'cacheDir' => '/tmp', ]);
2. 启用测试后的模拟清理
取消_after()方法中test::clean()的注释,确保每次测试后清除所有模拟替身,避免残留影响后续测试:
protected function _after() { test::clean(); // 移除所有注册的测试替身 }
3. 验证类命名空间一致性
确认app\models\Settings的命名空间与实际文件的命名空间完全匹配,测试类中的use app\models\Settings;没有拼写错误。
4. 清理AspectMock缓存
删除/tmp目录下的AspectMock缓存文件,避免之前错误加载产生的缓存干扰新配置的生效。
修复后效果
调整完成后运行测试,Settings::getSettings()会返回你设定的"mock"值,模拟生效。
内容的提问来源于stack exchange,提问作者Omi
相关产品推荐
相关产品推荐

