PHP - 用于拦截方法调用的runkit的替代方法

rid*_*rid 5 php reflection runkit

我有一些非常不友好的测试代码(至少可以说是我需要测试的).不幸的是,重构不是一种选择.我必须按原样测试代码,而不必更改它.

为此,我考虑拦截函数调用并动态更改它们的作用,以便我可以运行我的测试,因为我需要一些函数和方法来返回已知值,我需要其他人发出请求,连接到数据库等等,停止这样做,并返回我需要他们返回的东西.有没有办法做到这一点没有runkit_method_redefine(),这最好不是"实验",仍然保持?也许是runkit的替代品?也许更好的方式?

编辑:如果我需要该功能,将使用PHPUnit的测试双精度和PHP 5.3.2的功能来使私有方法可访问.

Gor*_*don 15

注: 该试验助手扩展取代https://github.com/krakjoe/uopz

PHPUnit的Test Helper扩展(PECL)允许使用您自己的实现重新定义/拦截/存根/模拟硬编码的依赖项:

protected function setUp()
{
    $this->getMock(
      'Bar',                    /* name of class to mock     */
      array('doSomethingElse'), /* list of methods to mock   */
      array(),                  /* constructor arguments     */
      'BarMock'                 /* name for mocked class     */
    );

    set_new_overload(array($this, 'newCallback'));
}
Run Code Online (Sandbox Code Playgroud)

它还允许拦截exit语句和实例创建:

对于存根和模拟方法,您只需使用PHPUnit的常规模拟框架.看到

您还可以将Mockery与PHPUnit一起使用:

另一种选择是使用http://antecedent.github.io/patchwork

拼布是一个PHP库,能够在运行时重新定义用户定义的函数和方法,松散的复制功能runkit_function_redefine在纯PHP 5.3的代码,其中,除其他事项外,让你可以使用测试双打代替静态和私有方法.