Можно ли с помощью фиктивных объектов PHPUnit ожидать вызова магического метода __call ()? - PullRequest
28 голосов
/ 02 июня 2011

У меня есть фиктивный объект в тесте. Реальный объект 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 Ответ

43 голосов
/ 02 июня 2011

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

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

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

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

...