我在Mock Aspect配置中错过了什么?

时间:2017-10-07 13:19:45

标签: php symfony unit-testing mocking phpunit

我正在使用Symfony框架的guard component开发一个phpcas包。我的捆绑包正在运行,但我想做一些单元测试。我想测试我的CasAuthenticator。 PhpCAS library正在使用静态方法。所以我决定用Mock Aspect来模仿它。

我配置了Aspect,但我还有一个bug。

这是一个正在运行但失败的简化测试。

Screenshot of the failing test

  

预期要调用的PhpCAS :: setDebug但它从未发生过。得到了:

     

C:\ wamp64 \ WWW \ casguard \ casguard \厂商\ codeception \纵横模拟\ SRC \ AspectMock \代理\ Verifier.php:64

     

C:\ wamp64 \ WWW \ casguard \ casguard \测试\ SimpleTest.php:32   

//root_dir/Tests/SimpleTest.php
namespace AlexandreT\Bundle\CasGuardBundle\Tests;

use PHPUnit\Framework\TestCase;
use AspectMock\Test as test;
use PhpCAS;

class SimpleTest extends TestCase
{
    public function testAspectMock()
    {
        $phpCas = test::double('PhpCAS', ['setDebug' => function () {
            echo 'YES I CALL THE MOCKED Debug function';
        }]);
        PhpCAS::setDebug();
        $phpCas->verifyInvoked('setDebug', false);
    }

    protected function tearDown()
    {
        parent::tearDown();
        test::clean();
    }
}

输出不包含 YES我调用MOCKED调试函数,所以我认为PhpCAS不会被Aspect嘲笑。

我仔细阅读了this documentation,并按照以下方式配置了我的引导程序文件:

//root_dir/Tests/bootstrap.php
include __DIR__.'/../vendor/autoload.php'; // composer autoload

$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
    'debug' => true,
    'includePaths' => [
        __DIR__.'/../vendor/jasig/phpcas', 
    ],
]);

正如您所看到的,我添加了Cas.php声明PhpCAS类的供应商目录。但它并没有改变任何事情。我做了一些测试:bootstrap.php文件由phpunit加载。

我在Mock Aspect配置中错过了什么?

1 个答案:

答案 0 :(得分:0)

我在bootstrap.php文件中添加了一行来配置缓存目录 我可以看到Cas.php被很好地包括在内。

但我仍然有这个错误。当我浏览缓存文件时,我发现phpcas库并不尊重PSR0约定。 phpCAS Class的第一个字母不是大写的。

所以我编辑了我的测试:

public function testAspectMock()
{
    //$phpCas = test::double('PhpCAS', ['setDebug' => function () {
    //                        ^
    //                        | 
    //                        v
      $phpCas = test::double('phpCAS', ['setDebug' => function () {
        echo 'YES I CALL THE MOCKED Debug function';
    }]);
    phpCAS::setDebug(); //phpCAS instead of PhpCAS
    $phpCas->verifyInvoked('setDebug', false);
    //And I had an assertion else test is marked as risky.
    self::expectOutputString('YES I CALL THE MOCKED Debug function');
}

2个字母...... 2个小时的调试...... #Grrrr