Поскольку вы запрашиваете «лучшую практику», я отвечу по-другому:
Не тестировать защищенные и приватные методы
То, что вы можете, не означает, что вы должны.
Вы хотите проверить, работает ли класс. Это означает, что все функции , которые вы можете вызвать it (все общедоступно) , возвращают правильные значения (и, возможно, вызывают правильные функции для переданных объектов) и ничего больше .
Тебе все равно, как это реализовано в классе.
Имхо, даже вам больно писать тесты для чего-то непубличного по двум важным причинам:
Написание тестов занимает больше времени, поскольку вам нужно больше, а рефакторинг также занимает больше времени. Если вы перемещаетесь по коду в классе, не меняя его поведения, вам не нужно обновлять его тесты. Тесты должны сказать вам, что все еще работает!
Если вы пишете тест для каждого защищенного метода, вы теряете одно наследственное преимущество из отчета о покрытии кода: Он не будет сообщать вам, какие защищенные функции больше не вызывают . Это (imho) плохо, потому что вы либо не тестируете все публичные методы правильно (почему есть метод, который не вызывается, если вы тестируете каждый случай?), Либо вам действительно не нужен этот метод больше но так как он "зеленый", вы не задумываетесь над этим.
Цитировать PHPUnit Автор
Итак: если тестирование защищенных и закрытых атрибутов и методов возможно, это еще не значит, что это «хорошая вещь».
http://sebastian -bergmann.de / архив / 881-Testing-Your-Privates.html
Так как реальный мир иногда отличается
...->setAccessible()
хорошо для нормальных методов
для абстрактного материала ...->getMockForAbstractClass()
Но, пожалуйста, делайте это только в том случае, если действительно необходимо.
Защищенный метод в абстрактном классе будет протестирован путем тестирования публичного API его дочерних элементов в любом случае с применением моих аргументов сверху.