Возможно ли, используя фиктивные объекты PHPUnit, ожидать вызова метода magic call ()?


У меня есть макет объекта в тесте. Реальный объект, PageRepository, реализует магический метод, используя _ _ call (), поэтому если вы вызовете $pageRepository - >findOneByXXXX($value_of_field_XXXX), он будет искать в базе данных записи, соответствующие этому параметру.

Есть ли способ издеваться над этим методом?

Реальный вызов метода будет выглядеть примерно так:

$homepage = $pageRepository->findOneBySlug('homepage');

Тест будет выглядеть следующим образом:

$mockPageRepository->expects($this->any())
    ->method('findOneBySlug')
    ->will($this->returnValue(new Page()));

Но это не работает - PHPUnit не распознает вызов метода. То единственный способ заставить его увидеть метод-это явно определить метод в PageRepository.

1 28

1 ответ:

По PHPUnit по getMock() принимает второй аргумент-массив с именами методов на поругание. Если вы включаете имя метода в этот массив, макет объекта будет содержать метод с этим именем, над которым будут работать expects() и друзья.

Это относится даже к методам, которые не определены в" реальном " классе, поэтому что-то вроде следующего должно сделать трюк:

$mockPageRepository = $this->getMock('PageRepository', array('findOneBySlug'));

Имейте в виду, что вам придется явно включить любые другие методы, которые также должны быть высмеяны, так как только методы, названные в массиве, определены для макетного объекта.