- Вы можете использовать специальные классы, которые наследуют классы с закрытыми (теперь защищенными) методами и предоставляют открытые методы, которые вызывают невидимые извне защищенные методы.
Это называется Test Specific Subclass или TestСпециальное расширение в большой книге Рефакторинг кода теста http://xunitpatterns.com/
Более подробную информацию и идеи для тестирования частных методов вы можете прочитать здесь: http://xunitpatterns.com/Test-Specific%20Subclass.html
Это работает как
public TestClass : RealClass
{
public int CallHiddenCalculate()
{
return Calculate(); // Calculate is now protected method that we expose for test purposes in this class
}
}
Вы можете поместить этот класс в тестовую сборку, чтобы ваша реальная сборка не содержала специфичной для теста логики и классов из-за плохого дизайна.
- Вы также можете использовать условную компиляцию для атрибута видимости, как показано ниже
#if DEBUG
public
#else
private
#endif
В этом случае в Debug вы можете вызывать модульные тесты, но в релизе эти методы не будут видны.Однако этот подход намного хуже, чем выше, и более уродлив.
Тестирование только публичного интерфейса может быть недостаточно (и часто этого не достаточно), чтобы сказать, что вы получили хорошее тестовое покрытие и ваш код прост в обслуживании и рефакторинг.
Что касается маркировкизакрытые методы как внутренние и имеющие тестовую сборку, видят, что внутренние методы плохи по многим причинам
- ваши бывшие закрытые методы видны из вашей сборки, потому что они внутренние
- у вас будет тестовая логика(внутренний для этих методов будет только для целей тестирования) в версии выпуска вашего продукта, что плохо
, и я думаю, что есть и другие, но они наиболее важны