lapistano/proxy-object

一个库,使生成测试系统(SUT)的代理变得非常简单

v2.1.1 2014-07-11 12:51 UTC

This package is not auto-updated.

Last update: 2024-09-14 12:22:32 UTC


README

=========== ProxyObject

由Thomas Weinert于2008年启动,我接手了他的工作,完成了、扩展了并对其进行了测试。结果是这个小库,使生成测试系统(SUT)的代理变得非常简单。关于这个库的另一个想法是,如果你知道如何在PHPUnit中模拟类和方法,它应该非常容易使用。Proxy-object具有几乎相同的API,但不会更改代理类/方法的行为。唯一的目的就是公开隐藏的(受保护的和私有的)方法和成员。

当前的travis状态:构建状态

安装

感谢beberlei的反馈,现在源代码已经兼容PSR-0。不需要遵循特定的安装程序。只需将源代码克隆或检出到您的项目中并使用它。如果您不使用PSR-0兼容的自动加载器,只需将bootstrap.php添加到您的引导或自动加载器中。

Composer

将以下行添加到您的composer.json文件中,并更新您的项目composer安装。

{
    "require-dev": {
        "lapistano/proxy-object": "2.*"
    }
}

此composer配置将检出标记为第2次发布的源代码。如果您想获取'cutting eadge'版本,将'2.*'替换为'dev-master'。但请注意,这有时可能会出现损坏。

注意:如果您不知道这意味着什么,那么composer项目网站是一个很好的起点。

Github

因此,我建议使用composer方法将proxy-object作为依赖项添加到您的项目中。源代码也通过github提供。只需像您所熟悉的那样克隆它。

$ git clone git://github.com/lapistano/proxy-object.git

用例

  1. 公开不可见的方法

这个库的主要目的之一是公开不可见(私有或受保护的)方法到SUT。要做到这一点,只需创建一个新的ProxyBuilder对象并传入要公开的方法。

$proxy = new \lapistano\ProxyObject\ProxyBuilder('myClass');

// generate and configure proxied object
$proxiedObject = $proxy
    ->setConstructorArgs(array('Argument1', 'Argument2'))
    ->setMethods(array('myMethod'))
    ->getProxy();

// invoke proxied method
$proxiedObject->myMethod();
  1. 公开不可见的成员

这个库的另一个目的是公开不可见的成员,这些成员无法通过setter访问。这是为了防止您仅为了单元测试的目的编写setter方法。使用setProperties()方法来实现。

$proxy = new \lapistano\ProxyObject\ProxyBuilder('myClass');

// generate and configure proxied object
$proxiedObject = $proxy
    ->setProperties(array('myMember'))
    ->getProxy();

// change content proxied member
$proxiedObject->myMember = 'another value';

尽管可以通过在setProperties数组中命名它们来公开私有成员,但如果不声明属性,则生成代理对象只会公开受保护的成员。这是因为我不太喜欢从一个类中公开太多。如果有人认为应该改变这一点,我会非常乐意讨论这个话题。

  1. 创建一个不调用构造函数的代理对象

有时有必要抑制定义的构造函数的调用。因此,我遵循了PHPunits MockBuilder的API,并添加了disableOriginalConstructor()方法。

$proxy = new \lapistano\ProxyObject\ProxyBuilder('myClass');

// generate and configure proxied object
$proxiedObject = $proxy
    ->disableOriginalConstructor()
    ->getProxy();

// change value of proxied member
$proxiedObject->myMember = 'another value';

简化测试套件中对代理对象的访问

由于我真的很懒;)并且我真的很喜欢便利性,所以我扩展了PHPUnit_Framework_TestCase类并添加了以下方法。

/**
 * Provides a ProxyBuilder object.
 *
 * @param string $classname
 * @return lapistano\ProxyObject\ProxyBuilder
 */
protected function getProxyBuilder($classname) {
    return new \lapistano\ProxyObject\ProxyBuilder($classname);
}

您的每个测试用例都应该现在扩展您自己的扩展测试用例类,这样您就可以通过调用 $this->getProxyBuilder('\\my\\namespace\\myclass'); 来创建一个新的代理构建器。在上述示例中,它将看起来像这样。

// generate and configure proxied object
$proxiedObject = $this->getProxyBuilder('myClass')
    ->disableOriginalConstructor()
    ->getProxy();

// change value of proxied member
$proxiedObject->myMember = 'another value';

文档

由于API在源代码中有详尽的文档,我决定不编写单独的文档。使用 phpDocumentor 提取和生成您自己的文档。我在 doc/config 文件夹中添加了 phpdoc.example.ini。按照 doc/config/README 中的说明来设置文档的生成。

限制

正如您可能预料的那样,这个库必须处理一些限制。这些限制不是由这个实现引入的,而是来自PHP的限制。因此,无法暴露标记为final或static的方法。

未来内容

  • 改进错误消息(例如,解释为什么一个方法/成员无法暴露)