【问题标题】:testing with phpspec - mocking method from the current class使用 phpspec 进行测试 - 当前类的模拟方法
【发布时间】:2015-11-16 08:23:38
【问题描述】:

我正在学习 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() 以返回值?

【问题讨论】:

    标签: php testing mocking phpspec


    【解决方案1】:

    您尝试执行的操作称为部分模拟。

    在 phpspec 中不能故意进行部分模拟。准确地说,它在预言中是不可能的,它使用的模拟框架。

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

    您可以修复您的设计,或使用另一个模拟框架来完成您需要的工作(例如模拟)。

    你不应该模拟availableTasks() 方法,而是以它返回你期望的方式设置你的对象。模拟或存根合作者。

    附:值得一读My top ten favourite PhpSpec limitations

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-23
      • 2022-06-15
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多