我已阅读该指南,并按照安装和设置AspectMock到Yii2 basic。一切都很好,但它似乎并没有真正起作用,对象并没有被嘲笑。我认为问题可能来自路径配置,但我找不到解决方案。这是我的代码:
在bootstrap文件
# 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');
$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
'debug' => true,
'includePaths' => [__DIR__.'/../../'],
]);
$kernel->loadFile(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require_once(__DIR__ . '/../../vendor/autoload.php');
require_once(__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__));
在测试文件中
# test/codeception/models/UserTest.php
<?php
namespace tests\codeception\unit\models;
use yii\codeception\TestCase;
use app\models\User;
use AspectMock\Test as test;
class UserTest extends TestCase
{
protected function tearDown()
{
test::clean();
}
public function testUserObject()
{
$user = test::double(User::className(), [
'getId' => '5'
]);
$user->getId();
$user->verifyInvoked('getId');
}
}
这是结果
[例外]称为app \ models \ User-&gt; getId,但这是a的代理 类定义。可能你试图访问实例方法。 从此类构造实例
我做错了什么吗?请帮忙!提前谢谢。
答案 0 :(得分:2)
我还没有使用过AspectMock,但通过查看https://github.com/Codeception/AspectMock,我认为你嘲笑了错误的事情。
test::double('className')
模拟静态方法,
模拟对象必须传递类的实例:https://github.com/Codeception/AspectMock#beautifully-simple
$user = test::double(new User, ['getName' => 'davert']);
如果您只想模拟对象,Codeception\Util\Stub提供了足够的功能。
答案 1 :(得分:0)
看起来你忘了实际实例化mock。试试这个:
<?php
public function testUserObject()
{
$user = test::double(User::className(), [
'getId' => '5'
]);
$user-make();
$user->getId();
$user->verifyInvoked('getId');
}