Подтвердить что ты не робот

Возможно ли, используя 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.

4b9b3361

Ответ 1

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

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

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

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