PHPUnit:存根方法未定义怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

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

存根的示例类:

namespace MyApp;

class MyStubClass 
{
   public function mrMethod()
   {
     // doing stuff
   }   
}

为了存根,我写道:

// 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'));

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

$stub->mrMethod();
//PHP Fatal error:  Call to undefined method MockMyStubClass::mrMethod()

我在PHP 5.3.0中使用PHPUnit 3.4.3。

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

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

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

提问于
用户回答回答于

  • 确保你正在运行最新版本的PHPUnit(截至撰写本文时为3.4.6)
  • 使用完全限定名称空间减去第一个反斜杠。 $this->getMock('MyApp\Widgets\WidgetFactory');

我的部分问题是PHPUnit创建的存根类WidgetFactory实际上并不存在MyApp\Widgets\WidgetFactory。人们会认为如果试图存在一个不存在的类时会发生异常,但似乎没有发生名称空间混淆。

用户回答回答于

我有一个类似的问题,我的问题是我写的路径是类似的东西,MyApp\Widgets\WidgetFactory\MyStubClass而类是这样的:

namespace MyApp;

class MyStubclass 
{
   public function mrMethod()
   {
     // doing stuff
   }   
}

所以在路径中没有类名的大写C.

扫码关注云+社区