PHPUnit: stub 方法未定义

标签 php unit-testing mocking phpunit

我一定是遗漏了什么。我试图在 PHPUnit 中的类上 stub 方法,但是当我在模拟对象上调用该方法时,它告诉我该方法未定义。

要 stub 的示例类:

namespace MyApp;

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

为了 stub ,我写:

// 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 方法时,我得到一个异常:

$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() 不会接受带有前导反斜杠的命名空间)。我唯一能想到的原因可能是因为这门课是 注册了自动加载器?

有什么想法吗?

最佳答案

回答我自己的问题:

在经历了相当多的挫折之后,我确实设法让事情运转起来。我不确定到底是什么问题,但确实发现了一些可能对其他人有帮助的事情:

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

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

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

还有一个关于here的问题这建议使用类别名方法如下:

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

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

关于PHPUnit: stub 方法未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031385/

相关文章:

javascript - 将 JSON 数据从 php 传递给 html-data 属性,然后传递给 Javascript

php - PHP 中的 MD5 哈希验证因未知原因失败

swift - 单元测试单元格为零

java - 如何模拟传递给构造函数的参数

angular - 组件中的模拟服务 - 模拟被忽略

java - Mockito Test 不调用 verify() 方法

php - 有什么更好 : more Colums with Null or More tables?

php - 如何使用 MAX() 函数让 PHP 和 MySQL 返回一个整数?

java - JAX-WS 单元测试

ruby-on-rails - 编写无效的 FactoryGirl 工厂/特征是个坏主意吗?