jimthunderbird / phlexmock
一个允许开发者通过重新定义类方法来模拟任何PHP类的工具
Requires
- php: >=5.4.0
- nikic/php-parser: 1.0.*
This package is not auto-updated.
Last update: 2024-09-28 17:38:28 UTC
README
一个允许开发者为了测试目的重新定义PHP类方法的工具。
传统上,我们在PHP中使用PHPUnit等工具进行单元测试时,需要创建模拟类或模拟对象来模拟测试环境。由于PHP与其他脚本语言(例如Ruby)不同,不支持方法重定义,这使得对象和类的模拟变得有些繁琐。Phlexmock旨在将方法重定义的功能带到PHP中。
Phlexmock利用PHP中的spl_autoload_register函数与静态代码分析工具PHP-Parser相结合,实现了方法重定义功能。
警告:虽然方法重定义很强大,但我们建议仅将phlexmock用于单元测试和模拟,在生产代码中使用将会有性能影响。
##安装 将phlexmock添加到你的composer.json文件中
{
"require-dev": {
"jimthunderbird/phlexmock": "*"
}
}
##示例
###示例 01 ####在类中重开方法 ####假设我们在当前路径下有一个名为User.php的类,其结构如下
<?php class User { public function __construct($name) { echo "Default message for user constructor\n"; } public function ok() { echo "Default message for ok method\n"; } public function info() { echo "Default message for information\n"; } }
####如果我们执行以下操作
$user = new \User("a-user"); $user->ok(); $user->info();
####我们将看到每个方法的所有默认消息。
####现在让我们使用PhlexMock来重开方法。
<?php require_once __DIR__."/vendor/autoload.php"; $phlexmock = new \PhlexMock\PhlexMock(); $phlexmock->setClassSearchPaths([__DIR__]); #search the current directory for classes $phlexmock->start(); /** * reopen constructor */ \User::phlexmockMethod('__construct', function($name){ echo "Reopened constructor\n"; }); /** * reopen method ok */ \User::phlexmockMethod('ok', function(){ echo "Reopened ok method\n"; }); $user = new \User("a-user"); $user->ok(); \User::phlexmockMethod('info', function(){ echo "Reopened information"; }); $user->info();
####现在我们将看到重开方法的全部输出!这将使我们能够轻松修改或模拟任何类进行测试。
###示例 02 ####在重开的方法中使用this关键字
####假设我们在当前目录下有一个名为Circle.php的类,其结构如下
<?php class Circle { private $x; private $y; public function setX($x) { $this->x = $x; } public function getX() { return $this->x; } }
####我们希望重开Circle类中的setX方法,以便实例属性x将是传入的x值的两倍,即
$this->x = 2 * $x
####让我们使用PhlexMock来完成这个操作
<?php require_once __DIR__."/vendor/autoload.php"; $phlexmock = new \PhlexMock\PhlexMock(); $phlexmock->setClassSearchPaths([__DIR__]); $phlexmock->start(); \Circle::phlexmockMethod('setX', function($x){ $this->x = 2 * $x; }); $c = new \Circle(); $c->setX(2); echo $c->getX();
####现在setX方法被重开,在上述代码中,我们将在屏幕上看到4。
###示例 03 ####在重开的方法中使用self关键字
####假设我们在当前目录下有一个名为Storage.php的类,其结构如下
<?php class Storage { private static $value; }
####以下代码是使用PhlexMock创建一个新方法setValue来设置静态变量$value的代码
<?php require_once __DIR__."/vendor/autoload.php"; $phlexmock = new \PhlexMock\PhlexMock(); $phlexmock->setClassSearchPaths([__DIR__]); $phlexmock->start(); \Storage::phlexmockMethod('setValue', function($value){ self::$value = $value; });