【问题标题】:PHPUnit error call to undefined method on mockPHPUnit错误调用模拟上的未定义方法
【发布时间】:2016-04-21 14:08:54
【问题描述】:

当我在 Simple 类模拟上调用 mymethod() 时出现错误:调用未定义方法 Mock_SimpleInterface_8a93e777::mymethod()。

class PlaygroundTest extends \PHPUnit_Framework_TestCase 
{
    public function testMock()
    {
        $class     = $this->getMockBuilder('\Playground\Simple')->getMock();

        $class->mymethod();
    }
}

Simple 类实现

namespace Playground;

class Simple
{

    public function mymethod()
    {
        print "Hey!";
    }
}

根据 PHPUnit 文档 (https://phpunit.de/manual/5.1/en/test-doubles.html),它声明“默认情况下,原始类的所有方法都被替换为仅返回 null(不调用原始方法)的虚拟实现。”

难道我不能调用 mymethod() 并获得一个空返回值吗?我想避免指定所有类方法。 PHPUnit 应该足够聪明,知道哪些方法可以在 mock 上调用。

这是一个错误吗?我正在使用 PHPUnit 5.1.4

【问题讨论】:

  • 你是对的。这不是一个错误,我用过很多次。一定有不同的原因。您将模拟分配给$class,但在$interface 上调用mymethod()。真的是这样还​​是你的问题有错误?
  • 将我的代码复制到stackoverflow是一个错误。在实际代码中,它确实在 $class 上被调用过。 (我也对模拟接口进行了测试,这就是我错误地复制了我的代码的地方)。我会编辑。
  • 所以我只是复制并粘贴了您的代码,因为我看不到任何错误。我可以告诉你:没有。我完全没有错误:OK (1 test, 0 assertions) 是结果。问题必须是其他的。您是否有一个调用堆栈,您可以使用它来验证调用的实际来源?
  • 另外:您使用哪个 PHP 版本?
  • 它在 PHP7 上。但是根据文档,尽管 PHPUnit 5 与 PHP 7 兼容。我会在星期一详细检查调用堆栈。

标签: php unit-testing mocking phpunit


【解决方案1】:

您的假设是正确的,因此您在其他地方有错误或没有显示真实代码。

模拟类名称Mock_SimpleInterface_8a93e777 表明您实际上并不模拟\Playground\Simple,而是模拟\Playground\SimpleInterface,它可能不包含mymethod()

【讨论】:

  • 是的,我也尝试过使用界面。我想我将测试中的 stackoverflow 代码与一个类和一个具有接口的代码混合在一起(尽管结果相同)。
  • 然后检查是否可能自动加载了不同版本的类。
猜你喜欢
  • 2016-12-23
  • 2017-06-11
  • 2018-03-22
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2020-11-15
相关资源
最近更新 更多