Насмешка: как использовать shouldReceive с method_exists?

В коде моего приложения у меня есть проверка 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();
  [...]
}

Но это не работает, потому что в макете не определен метод method_exists. Я новичок в издевательстве над вещами, поэтому, возможно, есть очевидный способ справиться с этой проблемой, например, «заглушить» нужную функцию, но я не смог найти способ...

Заранее благодарю за любую помощь.


person Philippe    schedule 22.11.2015    source источник
comment
Исходник ListItemFactory было бы здорово увидеть.   -  person l-x    schedule 30.11.2015
comment
просто решал очень похожие вещи, проверьте stackoverflow.com/questions/37927273/ это может вам помочь   -  person user3350906    schedule 20.06.2016
comment
Вот что мне помогло: stackoverflow.com/a/46922330/470749   -  person Ryan    schedule 23.02.2019


Ответы (1)


Создайте небольшой класс тестирования и частично смоделируйте его. Определите в рамках вашего тестового класса:

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;)

person Tom    schedule 15.11.2018