Ложный вызов создания объекта 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 для каждого класса

Я считаю это запахом кода. Это часто говорит о том, что ваш класс пытается сделать слишком много вещей. Нарушение принципа единой ответственности (ПСП).

Таким образом, судя по всему, у вас есть проблема дизайна. Просмотрите свои классы и попробуйте рефакторинг их с агрегированными зависимостями. Подумайте о том, чтобы следовать более твердому принципу дизайна.

Другие вопросы по тегам