lapistano / proxy-object
一个库,使生成测试系统(SUT)的代理变得非常简单
Requires
- php: >=5.3.2
Requires (Dev)
- phpunit/phpunit: @stable
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,但不会更改代理类/方法的行为。唯一的目的就是公开隐藏的(受保护的和私有的)方法和成员。
安装
感谢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
用例
- 公开不可见的方法
这个库的主要目的之一是公开不可见(私有或受保护的)方法到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();
- 公开不可见的成员
这个库的另一个目的是公开不可见的成员,这些成员无法通过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数组中命名它们来公开私有成员,但如果不声明属性,则生成代理对象只会公开受保护的成员。这是因为我不太喜欢从一个类中公开太多。如果有人认为应该改变这一点,我会非常乐意讨论这个话题。
- 创建一个不调用构造函数的代理对象
有时有必要抑制定义的构造函数的调用。因此,我遵循了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的方法。
未来内容
- 改进错误消息(例如,解释为什么一个方法/成员无法暴露)