PHPunit 和 Mockery:找不到方法

Posted

技术标签:

【中文标题】PHPunit 和 Mockery:找不到方法【英文标题】:PHPunit and Mockery: method not found 【发布时间】:2013-03-24 07:01:18 【问题描述】:

我在使用 phpunit 和 Mockery 时遇到问题。由于某种原因,PHPunit 说我在 Mockery 中定义的方法 onFoo 不存在。

public function testReturnsTheCorrectValueWithClass()

    $listener = \Mockery::mock('FooListener');
    $listener->shouldReceive('onFoo')
             ->once()
             ->andReturn('foo');

    $this->eventManager->attach('foo.class', array($listener, 'onFoo'));

    $this->assertTrue($this->eventManager->dispatch('foo.class') === 'foo');

有人知道这段代码有什么问题吗?

【问题讨论】:

onFoo 是否存在于FooListener 中? 感谢您的回复泽克!实际上,FooListener 只是一个类,它有一个方法 onFoo,并且该方法返回“foo”。 “FooListener”类真的需要存在吗?我教过 Mockery 嘲笑那堂课?再次感谢。 我确信原始类/接口和目标方法都应该存在(虽然不完全确定该方法 - 我从未尝试模拟非真实类,因为它没有任何意义)跨度> 所以我需要用那个方法创建一个类?但是我为什么还要使用 Mockery 呢?谢谢。 mockery(和任何其他模拟库)使您能够设置具有某些已知行为的已知类的实例,以便您可以将其作为依赖项注入到测试对象。更一般的原因 - 是将测试类与其依赖项隔离开来。 【参考方案1】:

我找到了问题的解决方案!它与我的测试代码无关,但与我的 EventManager 获取模拟对象的方式有关。我创建了一个新的模拟对象实例,而不是只使用现有的。

感谢大家的帮助!

【讨论】:

“这与我的测试代码无关”——这很明显。如果类似的代码在一个测试中有效,而在另一个测试中无效 - 那么问题就出在其他地方。 真的!今天学到的另一个教训 :) 我的调试技能需要变得更好。 :)

以上是关于PHPunit 和 Mockery:找不到方法的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit:使用@runTestsInSeparateProcesses 时找不到嘲弄

自称 PhpUnit / Mockery 的模拟方法

在此模拟对象上找不到模拟方法 shouldRecieve() [关闭]

Phpunit 在测试类中仅模拟一种方法 - 使用 Mockery

Mockery/PhpUnit:测试成功但错误

在 Laravel 中使用 Mockery/phpUnit 时出错