You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:39:57