2015-12-25 2 views
1

Я прочитал руководство и последую за установкой и настройкой AspectMock на Yii2 basic. Все в порядке, но, похоже, на самом деле это не работает, объект не издевается. Я думаю, что проблема может быть получена из конфигурации пути, но я не нашел решение. Это мой код:Codeception aspectmock не может издеваться над объектом в Yii2

В загрузочном файле

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

Это результат

[Exception] Названные приложения \ модели \ User-> GetId , но это прокси-сервер для определения класса . Вероятно, вы пытались получить доступ к методу экземпляра. Построить экземпляр этого класса

Я что-то не так? Пожалуйста помоги! Заранее спасибо.

ответ

1

Я не использовал 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 обеспечивает достаточную функциональность.

0

Похоже, вы забыли на самом деле создать экземпляр макета. Попробуйте это вместо:

<?php 
public function testUserObject() 
{ 
    $user = test::double(User::className(), [ 
     'getId' => '5' 
    ]); 
    $user-make(); 
    $user->getId(); 
    $user->verifyInvoked('getId'); 
} 
Смежные вопросы