Имитация псевдонима сохраняется в тестовых классах

Я создал макет псевдонима, используя Mockery в классе A, чтобы имитировать вызовы некоторых общедоступных статические методы, созданные в классе, который я хочу протестировать.

В другом тестовом классе B я хочу использовать эти общедоступные статические методы (не издеваемые), но похоже, что макет псевдонима, созданный в тестовом классе A, сохраняется при выполнении тестового класса B. При запуске тестов в тестовом классе B я получаю это исключение: BadMethodCallException: Static method Helper::formatDate() does not exist on this mock object, хотя класс Helper не следует издеваться над классом B.

Я попытался добавить:

/**
 * @runTestsInSeparateProcesses
 * @preserveGlobalState disabled
 */

в тестовых классах, чтобы они запускались отдельно, но потом я получаю эту ошибку:

PHPUnit_Framework_Exception: PHP Fatal error: Class 'TestCase' not found

У кого-нибудь есть идеи, как это решить?


person Fredrik Salin    schedule 28.01.2016    source источник


Ответы (1)


Попробуйте использовать AspectMock, который должен имитировать статические методы: https://github.com/Codeception/AspectMock

В любом случае эта проблема указывает на то, что ваш код не тестируется. Вам следует подумать о его рефакторинге и не использовать статические вызовы, которые необходимо имитировать.

person gontrollez    schedule 28.01.2016
comment
Спасибо за ваш ответ @gontrollez. С Mockery также можно издеваться над статическими методами, и я действительно не хочу менять фреймворк для имитации, поскольку у меня уже есть довольно много модульных тестов, использующих Mockery. Mockery также интегрирован в фреймворк, который я использую. Возможно, я смогу реорганизовать свой код, но Laravel по умолчанию использует довольно много вызовов статических методов. - person Fredrik Salin; 29.01.2016
comment
Ага, я понимаю. Я не использовал Laravel в реальных проектах, поэтому не могу сказать, но я почти уверен, что должен быть способ полностью протестировать код, разработанный с помощью Laravel. Попробуйте задать вопрос, связанный с Laravel. - person gontrollez; 29.01.2016