我一定错过了什么。我正在尝试在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'));
但是在调用stubbed方法时,我得到一个例外:
$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()不会接受带有反斜杠的命名空间)。我能想到的唯一可能是因为这个课程是这样的 在自动加载器上注册?
有什么想法吗?
答案 0 :(得分:18)
回答我自己的问题:
经过相当多的挫折之后,我确实设法让事情发生了变化。我不确定究竟是什么问题,但确实发现了一些可能对其他人有所帮助的事情:
使用完全限定的命名空间减去第一个反斜杠。
$this->getMock('MyApp\Widgets\WidgetFactory');
我的部分问题是PHPUnit正在创建一个实际上没有存根WidgetFactory
的存根类MyApp\Widgets\WidgetFactory
。可以预料,如果尝试存根不存在的类会发生异常,但似乎不会发生命名空间混淆。
此外,还有一个问题here建议使用类别名方法,如下所示:
class_alias('MyApp\Widgets\WidgetFactory', 'WidgetFactory');
$this->getMock('WidgetFactory');
虽然这确实暂时解决了我的问题,但我强烈建议不要使用它。如果没有引发异常,则class_alias()
不能为相同的别名调用两次,如果在setup()
方法中使用,或者作为存根生成的一部分,则会导致明显的问题。
答案 1 :(得分:0)
我有一个类似的问题,我的问题是我写的路径类似于MyApp\Widgets\WidgetFactory\MyStubClass
而类是这样的:
namespace MyApp;
class MyStubclass
{
public function mrMethod()
{
// doing stuff
}
}
因此,路径
中类的名称中没有大写的C