PHPUnit: 存根方法未定义

2022-08-30 23:33:38

我一定错过了什么。我试图在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()

我使用的是 PHPUnit 3.4.3 和 PHP 5.3.0。

我注意到的另一件小事是,如果在方法中指定命名空间会导致类加载异常,因为双精度命名空间:getMock()

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

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

有什么想法吗?


答案 1

回答我自己的问题:

在经历了相当多的挫折之后,我确实设法让事情顺利进行。我不确定问题到底是什么,但确实发现了一些可能有助于他人的事情:

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

    $this->getMock('MyApp\Widgets\WidgetFactory');
    

我的部分问题是PHPUnit正在创建一个实际上没有存根的存根类。人们会期望,如果尝试存根一个不存在的类,就会发生异常,但似乎不会在命名空间混淆时发生。WidgetFactoryMyApp\Widgets\WidgetFactory

此外,这里还有一个问题,建议使用类别名方法,如下所示:

    class_alias('MyApp\Widgets\WidgetFactory', 'WidgetFactory');
    $this->getMock('WidgetFactory');

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


答案 2

我遇到了类似的问题,我的问题是我正在写的路径是这样的,而课程是这样的:MyApp\Widgets\WidgetFactory\MyStubClass

namespace MyApp;

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

因此,路径中的类名称中没有大写的C


推荐