Как убедиться, что метод существует в реальном объекте при насмешке?

Я бы хотел, чтобы мой тест провалился, если я издеваюсь над интерфейсом, используя Mockery, и использую shouldReceive с несуществующим методом. Оглядеться не помогло.

Например :

С интерфейсом:

interface AInterface {
    public function foo();
    public function bar();
}

И тестовый пример:

function testWhatever{
    Mockery::mock('AInterface')->shouldReceive('bar');
    $this->assertTrue(true);
}

Испытание пройдет.

Теперь, время рефакторинга, метод bar не нужен в одном месте (скажем, он нужен в нескольких местах) и исключен из определения интерфейса, но тест все равно пройдет. Я хотел бы, чтобы это не удалось.

Можно ли сделать такое с помощью издевательств (и сделать то же самое с классом вместо интерфейса)? Или существует обходной путь с каким-то другим инструментом или методологией тестирования?

Не уверен, что это можно понять как есть, постараюсь сделать более четкое описание проблемы, если это необходимо.


person SelrahcD    schedule 15.05.2013    source источник


Ответы (2)


Чтобы гарантировать, что Mockery не позволит вам имитировать несуществующие методы, поместите следующий код в файл начальной загрузки PHPUnit (если вы хотите, чтобы такое поведение выполнялось для всех тестов):

\Mockery::getConfiguration()->allowMockingNonExistentMethods(false);

Если вам просто нужно такое поведение для определенного тестового примера, поместите код в метод setUp() для этого тестового примера.

Дополнительную информацию см. в этом разделе руководства по Mockery на Github.

person Eugene M    schedule 11.10.2013
comment
Эй, спасибо за ответ. Попробую позже и отмечу как действительное, если да :) - person SelrahcD; 14.10.2013
comment
Привет @Eugene M. Совершенно забыл об этом вопросе. Сегодня провел несколько тестов, и ваше решение, похоже, работает для макетов классов, но не для макетов интерфейса. Я что-то упустил или это все-таки невозможно? (Я могу поделиться с вами своим тестовым кодом, если это необходимо;)) - person SelrahcD; 24.08.2015
comment
@SelrahcD Честно говоря, я не уверен ... Я видел, что документация Mockery была перемещена, поэтому я обновил ссылку в ответе на соответствующую страницу ... хотя, похоже, она не касается конкретно классов и интерфейсов. - person Eugene M; 27.08.2015
comment
Провели еще несколько тестов с коллегой, и мы пришли к выводу, что это работает только для классов. Я не знаю, должен ли я отметить ваш ответ как правильный, потому что я говорил об интерфейсах, а не о классах, но это мне очень помогло. Спасибо :) - person SelrahcD; 29.08.2015

Если вы хотите убедиться, что метод вызывается только один раз, вы можете использовать once().

Предположим, что класс AImplementation реализует интерфейс AInterface, и вы хотите проверить, вызывается ли метод, например:

Mockery::mock('AImplementation')->shouldReceive('bar')->once();

Вы также можете использовать: zeroOrMoreTimes(), twice() или times(n), проверьте репозиторий на github. Кроме того, я рекомендую вам это руководство Джеффри В.

person Rodri_gore    schedule 03.06.2013
comment
Я знаю о методе подсчета в насмешку, но это не гарантирует, что метод бара существует в AImplementation. Как я уже сказал в вопросе, я не уверен, что это было ясно выражено, возможно, мне следует провести рефакторинг вопроса :) В любом случае спасибо и que tenga un buen día! - person SelrahcD; 05.06.2013
comment
Once() убедитесь, что метод вызывается, поэтому метод bar существует в вашем производственном коде. - person Rodri_gore; 06.06.2013
comment
В моем производственном коде да, но не в AImplementation, а только в издевательском объекте. - person SelrahcD; 06.06.2013