Intereting Posts

Возможно ли, используя PHPUnit mock objects, ожидать вызова магического метода __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.

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

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

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

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