【问题标题】:PHPUnit Mock Object replacing Real ClassPHPUnit 模拟对象替换真实类
【发布时间】:2013-04-27 04:17:15
【问题描述】:

我的测试套件中有几个测试在 Zend_Test 中运行

一个测试通过 PHPUnit 的 MockBuilder 创建一个模拟 Foo_Bar_Baz 作为该类的依赖项。现在在Foo_BAR_baz 的测试中(更改大小写是故意的,并且由于自动加载是必要的),我没有得到类,而是模拟的一个实例,这显然不起作用。

对对象执行var_dump 会产生class Foo_Bar_Baz#27115(0) { },因此它似乎是在创建模拟实例。

修复模拟中的情况可以让事情按预期工作。我以前从未在模拟对象中看到过这种行为。由于某种原因,模拟类被加载到 PHP 中,因此当下一个测试尝试实例化真实对象时,它会实例化模拟类。为什么会发生这种情况?

【问题讨论】:

  • “我没有得到课程,而是模拟的一个实例” - 你能澄清一下吗?您的代码(不是测试)正在实例化一个对象,并且您期望它是一个究竟是什么的实例,而您得到的究竟是什么?
  • 读了几遍之后也许会有所帮助:如果你正在创建一个模拟类并以真正的具体类命名它,那么你将永远无法将具体类放入内部注册表。
  • 我可以得到类名相同的具体类。只有当它们与我的示例不同时,它才不起作用。通常这在 PHPUnit 中有效,除非在这种非常奇怪的情况下。

标签: phpunit zend-test


【解决方案1】:

PHP 中的类名不区分大小写,但 *nix 服务器上的文件名是。

我怀疑大小写的变化会因为自动加载机制而导致行为发生变化; PHP 只会自动加载 Foo_Bar_Baz.php 和 Foo_BAR_Baz.php 之一。

在您的情况下,如果您已经定义了一个类 Foo_BAR_Baz(作为模拟),那么 PHP 将对 Foo_Bar_Baz 使用相同的定义,从而忽略您真正的类定义。

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多