kambo/classopener

在 PHPUnit 中模拟/存根最终类和方法。

v0.0.1 2018-02-18 12:58 UTC

This package is auto-updated.

Last update: 2024-09-19 17:11:28 UTC


README

构建状态 Scrutinizer 代码质量 代码覆盖率 软件许可 你不觉得在 PHPUnit 中模拟/存根最终类和方法会很棒吗?使用这个包,你可以做到这一点。只需从 ClassOpenerTestCase 扩展你的测试用例,并在测试方法注释中添加以下注解@disableFinal name\of\the\final\class 之后,你可以继续使用常规的模拟/存根技术。

但请注意,这里有几个需要注意的地方,因为这是一个包装得很好的“黑客”。

安装

安装库的首选方式是使用 composer

composer require kambo/classopener

用法

ClassOpenerTestCase 扩展你的测试用例,并在测试方法注释中添加以下注解@disableFinal name\of\the\final\class 之后,你可以继续使用常规的模拟/存根技术。

示例

<?php

use Kambo\Testing\ClassOpener\PHPUnit\ClassOpenerTestCase;

class ClassOpenerTestCaseTest extends ClassOpenerTestCase
{
    /**
     * Disable final and mock the class
     *
     * @disableFinal Kambo\Tests\Testing\ClassOpener\Fixtures\Foo
     */
    public function testAnnotationMocking()
    {
        // You can use your traditional mocking/stubing techniques
        $fooMock = $this->getMockBuilder(Foo::class)
                        ->disableOriginalConstructor()
                        ->getMock();

        $fooMock->method('bar')->will($this->returnValue(false));

        $this->assertFalse($fooMock->bar());
    }
}

注意事项

类的“打开”必须在创建任何类实例之前完成。这个前提很容易被之前运行的测试破坏。一个可能的解决方案是隔离使用 Class open 注解 @runInSeparateProcess 的测试。

示例

<?php

use Kambo\Testing\ClassOpener\PHPUnit\ClassOpenerTestCase;

class ClassOpenerTestCaseTest extends ClassOpenerTestCase
{
    /**
     * Disable final and mock the class
     *
     * @runInSeparateProcess
     * @disableFinal Kambo\Tests\Testing\ClassOpener\Fixtures\Foo
     */
    public function testAnnotationMocking()
    {

致谢

基于 Mark Baker 的优秀文章: 通过操纵 AST 扩展最终类和方法

许可

MIT 许可证 (MIT),https://open-source.org.cn/licenses/MIT