Работа над дизайном
- Определите обязанности этого класса.
- Далее, Извлеките зависимости этого класса. Переместите все методы, которые не совпадают с маркером # 1, в зависимость.
например. если этот класс не отвечает за обработку баз данных или сетевой ввод-вывод, извлеките их как зависимости этого класса. Вставьте их как аргументы ctor или аргументы метода (если это требуется только для одного публичного метода).
public A(DataRepository repository, WebService service, SpaceStation spaceStation)
{ // cache them as internal fields;}
Теперь нет необходимости заглушать или создавать подклассы и переопределять или увеличивать видимость элемента для тестирования.
Ваши юнит-тесты создадут экземпляр как
_testSubject = new A(new Mock<DataRepository>.object, new Mock<WebService>.object, new Mock<SpaceStation>.object);
тогда как ваш производственный код будет использовать реальные реализации указанных выше ролей.