使用phpspec进行测试 - 来自当前类的模拟方法

时间:2015-11-16 08:23:39

标签: php testing mocking phpspec

我正在学习phpspec并且无法弄清楚测试没有通过的原因。

这是我的功能:

public function isTaskForChange($task)
{
    $supportedTasks = array_keys($this->availableTasks()); 
    $isTaskForChange = in_array($task, $supportedTasks);

    return $isTaskForChange;
}

这是phpspec中的测试:

public function it_validates_if_task_should_be_changed()
{
    $this->isTaskForChange('write')->shouldReturn(true);
}

但是,当我运行此代码时,我会回来:

warning: array_keys() expects parameter 1 to be array, null given

我的问题是:如何模拟$ this-> availableTasks()来返回值?

1 个答案:

答案 0 :(得分:5)

您尝试做的事情称为部分嘲笑。

有目的地无法在phpspec中进行部分模拟。确切地说,它在预言中是不可能的,它使用的模拟框架。

这样做的原因是部分模拟的需要最有可能传达设计问题(在这种情况下违反单一责任原则)。 Phpspec和预言是高度自以为是的工具。它们专为想要使自己的设计正确的人设计。因此有些事情是不可能的。

您可以修复您的设计,也可以使用其他模拟框架来完成您的需求(如嘲弄)。

你不应该嘲笑方法availableTasks(),而是以一种它返回你期望的方式设置你的对象。模仿或捣乱合作者。

P.S。值得一读My top ten favourite PhpSpec limitations