Должен ли я издеваться над фабричным классом
НЕТ . Не высмеивайте проблемы реализации, насмехайтесь над абстракциями.
или это неправильный дизайн?
Это не гибкий дизайн, поскольку ваши классы тесно связаны с проблемами конкретизации / реализациикоторые плохо поддаются изолированным модульным тестам.
Как выполнить модульное тестирование этого контроллера, поскольку для класса факторов не определен интерфейс?
Затем определитеабстракция (контракт) для завода. (Может быть интерфейсом или абстрактным классом)
public interface IProcessFactory {
IProcess GetInstance(int id);
}
и иметь реализацию, унаследованную от абстракции
public class MyFactory : IProcessFactory {
//...
}
Теперь контроллер может быть реорганизован для явной зависимости от абстракции с помощью инъекций конструктора.
public class HomeController : Controller {
private readonly IProcessFactory factory;
private readonly MyConfigurations configurations;
public HomeController(IProcessFactory factory, MyConfigurations configurations) {
this.factory = factory;
this.configurations = configurations;
}
//...omitted for brevity
}
Теперь это позволяет заменять макет при тестировании контроллера в изоляции.
Предполагается, что MyConfigurations
- это POCO, хранящий настройки / опции, которые не падают. при функциональных проблемах, требующих абстракции.
Последний шаг будет заключаться в обеспечении того, чтобы фактическая производная реализация фабрики вводилась в контроллер при производстве.