Я использую и люблю Moq, но использую другой контейнер IoC, чем Ninject.Я никогда не чувствовал необходимости интегрировать инфраструктуру для макетирования / изоляции и контейнеров IoC.Я использую инъекцию конструктора, а затем просто передаю фиктивные объекты своим классам в модульных тестах.Только производственный код использует контейнер.
ИМХО, реальная проблема здесь в том, что Car знает о ObjectBuilder.Вместо того, чтобы использовать контейнер в качестве локатора службы, почему бы не внедрить конструктор?Таким образом, только один класс верхнего уровня должен знать что-либо о контейнере IoC.
class Car
{
public Car(IEngine engine)
{
// May want a null check here
Engine = engine;
}
public IEngine Engine { get; private set; }
}
Тестировать автомобиль в изоляции легко;создайте фиктивный IEngine и передайте его конструктору.
Вы можете передать фабричный интерфейс, если вам нужно создать движок позже.
Если вы решите перейти на другойIoC Framework, вам нужно всего лишь изменить один или два класса верхнего уровня.