jimthunderbird/phlexmock

一个允许开发者通过重新定义类方法来模拟任何PHP类的工具

dev-master 2015-04-19 07:10 UTC

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;
});