jsiefer / class-mocker
可以模拟整个框架或命名空间
Requires
- php: ~5.6||~7.0||~7.1
- phpunit/phpunit: ~3.7||~4.0
- zendframework/zend-code: ^3.0
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpmd/phpmd: ^2.3
- satooshi/php-coveralls: dev-master
- squizlabs/php_codesniffer: ^2.5
This package is not auto-updated.
Last update: 2024-09-14 18:53:03 UTC
README
[] (https://travis-ci.org/jsiefer/class-mocker) [
] (https://coveralls.io/github/jsiefer/class-mocker?branch=master)
简介
一个简单的辅助库,允许您模拟整个框架或命名空间。这对于编写不支持单元测试的库的扩展或插件的单元测试很有帮助。
想法是自动模拟整个命名空间。类将在需要时即时生成。
如果需要,您可以注册特性以向某些类添加特殊功能。
或者,您可以创建一个类足迹参考文件,其中包含类层次结构、接口或常量等信息。
示例
一个简单的例子,假设您正在编写一个框架的插件或扩展,该框架不支持单元测试,但它要求您从难以模拟(不初始化整个框架)的类扩展。
/** * My awesome sample plugin */ class MyPlugin extends Example_Namespace_AbstractPlugin { /** * Return full name * * @return string */ public function getName() { if (!$this->_isLoaded) { throw new Exception("Not yet loaded"); } $firstname = $this->getFirstname(); $lastname = $this->getLastname(); return $firstname . ' ' . $lastname; } }
现在假设为了测试上述方法,您需要初始化整个框架,这可能需要几秒钟,从而违背了快速单元测试的目的。
class-mocker 库允许您生成任何与模式匹配的缺失类(例如 Example_Namespace_*),然后为您即时生成。
所有生成的类也将实现 PHPUnit_Framework_MockObject_MockObject 接口,并为您提供访问 expects() 和 method() 方法以进行测试的能力。
要启用 class-mocker,您需要为您的 PHPUnit 测试项目创建一个自定义引导文件,并定义您想要即时生成的类。
<?php /** * Sample PHPUnit bootstrap.php */ include 'vendor/autoload.php'; $classMocker = new \JSiefer\ClassMocker\ClassMocker(); //$classMocker->mock('Example\Namespace\*'); $classMocker->mock('Example_Namespace_*'); $classMocker->enable();
这就完成了,现在一旦启用,您就可以简单地测试您的类,而无需要求任何原始框架类。
/** * Class MyPluginTest */ class MyPluginTest extends PHPUnit_Framework_TestCase { /** * Test the getName method * * @return void * @test */ public function testGetName() { /** @var MyPlugin|PHPUnit_Framework_MockObject_MockObject $myPlugin */ $myPlugin = new MyPlugin(); $myPlugin->_isLoaded = true; $myPlugin->expects($this->once())->method('getFirstname')->willReturn('John'); $myPlugin->expects($this->once())->method('getLastname')->willReturn('Snow'); $this->assertEquals( 'John Snow', $myPlugin->getName(), 'getName() Plugin did not return correct full name' ); } /** * Should throw exception if object is not loaded * * @test * @expectedException Exception * @expectedExceptionMessage Not yet loaded */ public function shouldFailGetNameIfNotLoaded() { /** @var MyPlugin|PHPUnit_Framework_MockObject_MockObject $myPlugin */ $myPlugin = new MyPlugin(); $myPlugin->_isLoaded = false; // should throw Exception $myPlugin->getName(); } }
高级
当您想要模拟框架时,还有很多其他的东西,例如类层次结构、类常量和一些基本类。
模拟许多类时,重要的是整个 PHPUnit 测试需要同意相同的实现。
您可以定义类足迹并包含 JSON 类足迹参考文件以克隆整个类树。
理想情况下,您不直接使用此库,而是创建一个框架模拟库,该库提供所有必需的类引用和常量等,并在项目中使用该库进行测试。
此项目最初创建是为了模拟 Magento 进行单元测试。查看 mock-mage 库,该库使用此库来模拟整个 Magento 框架/应用程序。