Codeception aspectmock不能在Yii2

时间:2015-12-25 03:08:59

标签: codeception

我已阅读该指南,并按照安装和设置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的代理   类定义。可能你试图访问实例方法。   从此类构造实例

我做错了什么吗?请帮忙!提前谢谢。

2 个答案:

答案 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');
}