PHPUnit:存根方法未定义

Bry*_* M. 17 php phpunit unit-testing mocking

我肯定错过了什么.我正在尝试在PHPUnit中的类上存根方法,但是当我在模拟对象上调用该方法时,它告诉我该方法是未定义的.

存根示例类:

namespace MyApp;

class MyStubClass 
{
   public function mrMethod()
   {
     // doing stuff
   }   
}
Run Code Online (Sandbox Code Playgroud)

为了存根,我写道:

// specifying all getMock() args to disable calling of class __construct()
$stub = $this->getMock('MyStubClass', array(), array(), 'MockMyStubClass', false, false, false);
$stub->expects($this->any())
     ->method('mrMethod')
     ->will($this->returnValue('doing stuff'));
Run Code Online (Sandbox Code Playgroud)

但是在调用stubbed方法时,我得到一个异常:

$stub->mrMethod();
//PHP Fatal error:  Call to undefined method MockMyStubClass::mrMethod()
Run Code Online (Sandbox Code Playgroud)

我在PHP 5.3.0中使用PHPUnit 3.4.3.

我注意到的另一个小问题是,如果在getMock()方法中指定名称空间会导致类加载异常,因为双重名称空间:

$stub = $this->getMock('MyApp\MyStubClass');
// Fatal error:  Class 'MyApp\MyApp\MyStubClass' not found
Run Code Online (Sandbox Code Playgroud)

这让我觉得很奇怪(并且getmock()不会接受带有反斜杠的命名空间).我能想到的唯一原因可能是因为这个类是在自动加载器中注册的吗?

有什么想法吗?

Bry*_* M. 18

回答我自己的问题:

经过相当多的挫折之后,我确实设法让事情变得有效.我不确定究竟是什么问题,但确实发现了一些可能有助于他人的事情:

  • 确保您运行的是最新版本的PHPUnit(撰写本文时为3.4.6)
  • 使用完全限定的命名空间减去第一个反斜杠.

    $this->getMock('MyApp\Widgets\WidgetFactory');
    
    Run Code Online (Sandbox Code Playgroud)

我的部分问题是PHPUnit正在创建一个WidgetFactory实际上没有存根的存根类MyApp\Widgets\WidgetFactory.可以预料,如果尝试存根不存在的类会发生异常,但似乎不会发生命名空间混淆.

此外,还有超过一个问题在这里是建议使用类的别名方法如下:

    class_alias('MyApp\Widgets\WidgetFactory', 'WidgetFactory');
    $this->getMock('WidgetFactory');
Run Code Online (Sandbox Code Playgroud)

虽然这确实暂时解决了我的问题,但我强烈建议不要使用它.class_alias()如果没有引发异常,则不能为同一别名调用两次,如果在setup()方法中使用,或者作为存根生成的一部分,则会导致明显的问题.