【问题标题】:PHPUnit getMock() with namespace带有命名空间的 PHPUnit getMock()
【发布时间】:2010-11-18 17:23:51
【问题描述】:

我对开始在 PHP 中使用命名空间的追求仍在继续。这次 PHPUnit 给我带来了问题。我的 setup() 方法是这样的:

$test = new \MyNamespace\NonPersistentStorage(); // works
$mock = $this->getMock('\\MyNamespace\\NonPersistentStorage'); // doesn't work

getMock() 方法只会导致 PHP 寻找 NonPersistentStorage 类。不在命名空间内。

问:要让 getMock() 方法在命名空间中查找类,我需要进行哪些更改?

编辑:双反斜杠不是问题。另请参阅:the manual:(引用)

'在单引号字符串中,反斜杠转义序列使用起来更安全,但仍建议将所有字符串中的反斜杠作为最佳实践进行转义。'

编辑:对我有用的是 Ignace R 的答案。

【问题讨论】:

    标签: php namespaces phpunit


    【解决方案1】:

    改用这个字符串(不带双反斜杠):

    $mock = $this->getMock('\MyNamespace\NonPersistentStorage');
    

    【讨论】:

      【解决方案2】:

      对类的字符串引用通常没有前导反斜杠。尝试删除它并告诉我们它是否有效。

      编辑: 如果没有,请尝试class_alias 在全局命名空间中为该类创建一个别名。但是,这将是一个丑陋的解决方案...

      【讨论】:

      • 好吧,我所说的“前导反斜杠”是指两个前导反斜杠,但无论如何我希望你能理解。
      • 然后尝试使用 class_alias 解决方法(以防您没有注意到编辑)。
      • 认为这行得通:class_alias('\\MyNamespace\\NonPersistentStorage', 'NonPersistentStorage'); $mock = $this->getMock('NonPersistentStorage');但它给出了“无法重新声明类”错误。也许我做错了?
      • 您的示例中似乎一切都正确完成。但是这两个语句中的哪个语句实际上引发了错误?是 class_alias 调用还是 getMock 调用?
      • 类别名。颠倒名称会产生与以前相同的错误。问题是我认为在 PHPUnit 模拟代码中:类 PHPUnit_Framework_MockObject_Mock,文件的第 132 行是:$isClass = class_exists($className, $callAutoload);这调用了我的自动加载函数,但没有找到它。但是 $className 以 getMock('className') 中给出的相同字符串开头,但名称空间部分被删除。所以我想解决方案是手动包含文件。
      【解决方案3】:

      我认为您可以解决您的问题,包括测试文件中的类 \MyNamespace\NonPersistentStorage。

      【讨论】:

      • 我认为你错过了模拟课程的全部意义。
      猜你喜欢
      • 2013-11-24
      • 2018-07-29
      • 2011-12-30
      • 2015-12-12
      • 2018-09-17
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多