Ложный вызов создания объекта IOC Unity
public class ExcelHelper : IExcelHelper
{
private ICustomLoadRepository _customLoadRepository;
public ExcelHelper(IUnityContainer unityContainer)
{
_customLoadRepository= unityContainer.Resolve<ICustomLoadRepository>();
}
}
Мы начали использовать RhinoMocks для модульного тестирования нашего кода.
Не уверен, как издеваться над строкой кода
_customLoadRepository = unityContainer.Resolve<ICustomLoadRepository>();
Мы не хотим, чтобы это было решено путем перехода от параметра конструктора, поскольку число таких параметров иногда достигает более 7-8 в классах.
1 ответ
Похоже, это проблема XY.
Тем не менее, обычно считается плохой практикой вставлять контейнер как зависимость в любой класс, потому что он отрицает цель использования внедрения зависимости. Такие конструкции имеют больше общего с шаблоном Service Locator. Что считается в этом контексте анти-паттерном.
Вместо этого вы должны практиковать принцип явных зависимостей
Методы и классы должны явно требовать (обычно через параметры метода или параметры конструктора) любых взаимодействующих объектов, в которых они нуждаются для правильного функционирования.
...
Классы с явными зависимостями более честны. Они очень четко заявляют, что им требуется для выполнения их конкретной функции.
public class ExcelHelper : IExcelHelper {
private readonly ICustomLoadRepository customLoadRepository;
public ExcelHelper(ICustomLoadRepository customLoadRepository) {
this.customLoadRepository = customLoadRepository;
}
//...
}
это можно легко проверить, внедрив макет абстрагированной зависимости, используя Rhino Mocks или любую другую фальшивую среду.
public void Some_unit_test() {
//Arrange
var stubCustomLoadRepository = MockRepository.GenerateStub<ICustomLoadRepository>();
stubCustomLoadRepository.Stub(_ => _.SomeCustomLoadMethod()).Return("Some value");
var classUnderTest = new ExcelHelper(stubCustomLoadRepository);
//Act
//...exercise class under test
//Assert
//...
}
Что касается вашего утверждения о наличии множества параметров конструктора,
Мы не хотим, чтобы это было решено путем перехода от параметра конструктора, так как число таких параметров иногда достигает более 7-8 для каждого класса
Я считаю это запахом кода. Это часто говорит о том, что ваш класс пытается сделать слишком много вещей. Нарушение принципа единой ответственности (ПСП).
Таким образом, судя по всему, у вас есть проблема дизайна. Просмотрите свои классы и попробуйте рефакторинг их с агрегированными зависимостями. Подумайте о том, чтобы следовать более твердому принципу дизайна.