Какой метод следует использовать для тестирования функциональности абстрактного класса в PHPUnit? - PullRequest
2 голосов
/ 23 марта 2011

Я знаю три подхода:

  1. Создать поддельный подкласс (выглядит некрасиво)
  2. Тест одного из реальных подклассов
  3. Использование getMockForAbstractClass () (противоречит миссии mocks; также не может заглушить неабстрактные методы)

Каков наилучший способ согласно концепции модульного тестирования?

Ответы [ 2 ]

4 голосов
/ 23 марта 2011

Я бы написал тесты только для конкретных классов, производных от абстрактного класса.Если вы обнаружите, что вы дублируете тесты среди них, напишите суперкласс и переместите туда дублированные тесты или используйте класс getMockForAbstract для них.

Так что, если у вас было что-то вроде этого:У меня был бы тестовый класс для механика и инженера, тестирующего их реализацию doWork, но не их getName функциональность, потому что это наследуется абстрактным классом.Для этого я бы написал собственный класс или использовал бы getMockForAbstractClass, как показано в примере в Руководстве по PHPUnit:

1 голос
/ 24 марта 2011

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

Когда абстрактный класс в основном завершен, я создаю конкретный подкласс дляпроверить в том же файле, что и контрольный пример, или я буду использовать макет.Обратите внимание, что getMockForAbstractClass() - это просто помощник, который находит для вас все абстрактные методы.Ничто не мешает вам объявить все абстрактные методы плюс некоторые конкретные с getMock().По этой причине я переопределяю getMock() в нашем базовом тестовом примере, чтобы объединить все абстрактные методы перед вызовом родителя.

...