Возможно ли, используя фиктивные объекты 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 ответ:
По PHPUnit по
getMock()
принимает второй аргумент-массив с именами методов на поругание. Если вы включаете имя метода в этот массив, макет объекта будет содержать метод с этим именем, над которым будут работатьexpects()
и друзья.Это относится даже к методам, которые не определены в" реальном " классе, поэтому что-то вроде следующего должно сделать трюк:
$mockPageRepository = $this->getMock('PageRepository', array('findOneBySlug'));
Имейте в виду, что вам придется явно включить любые другие методы, которые также должны быть высмеяны, так как только методы, названные в массиве, определены для макетного объекта.