Mockery:如何在method_exists中使用shouldReceive?

时间:2015-11-22 15:03:24

标签: php unit-testing testing mockery

在我的应用程序代码中,我进行了method_exists检查以授权在创建过程中挂钩:

// Note: $myClass is implementing a ListItemFactory interface.

if ($isCreate) {
  $methodName = "create{$attr}ListItem";

  if (method_exists($myClass, $methodName)) {
    $item = $myClass->$methodName();
  } else {
    [...]
  }
}

我试图测试此代码,模拟$myClass并检查实际上是否调用了$methodName。以下是我编写测试的方法:

/** @test */
function specific_create_method_is_called()
{
  $factory = Mockery::mock(ListItemFactory::class)->makePartial();
  $factory->shouldReceive("createCommentsListItem")->once();
  [...]
}

但这不起作用,因为没有在mock中定义method_exists。我很嘲笑这些东西,所以也许有一种明显的方法可以解决这个问题,例如" stubbing"想要的功能,但我无法找到方法......

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

创建一个小型测试类并对其进行部分模拟。 在测试类的范围内定义:

class MyClass implements ListItemFactory {
  public function createCommentsListItem() { } 
}

然后,在您的测试功能中:

/** @test */
function specific_create_method_is_called() 
{
  $myClass = m::mock(MyClass::class)->makePartial();

  $myClass->shouldReceive('createCommentsListItem')->once();

  // method_exists($myClass, 'createCommentsListItem')
  //   returns true now
}

(在此示例中:use Mockery as m;