kambo / classopener
在 PHPUnit 中模拟/存根最终类和方法。
v0.0.1
2018-02-18 12:58 UTC
Requires
- php: >=7.0.0
- nikic/php-parser: ^2.0
- roave/better-reflection: 1.2.0
Requires (Dev)
- phpunit/phpunit: ^6.5
- squizlabs/php_codesniffer: ^3.1
This package is auto-updated.
Last update: 2024-09-19 17:11:28 UTC
README
你不觉得在 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