Надлежащий способ Дразнить объекты репозитария за использование модульных тестов Moq и Unity

В моем задании мы используем Moq для насмешки и Единицу для контейнера IOC. Я довольно плохо знаком с этим и не имею многих ресурсов на работе для выручения меня с определением лучших практик, которые я должен использовать.

Прямо сейчас у меня есть группа интерфейсов репозитория (Исключая: IRepository1, IRepository2... IRepository4), который конкретный процесс должен использовать, чтобы сделать его задание.

В фактическом коде я могу определить все объекты IRepository при помощи контейнера IOC и использования RegisterType () метод.

Я пытаюсь выяснить лучший способ быть в состоянии протестировать метод, для которого нужны 4 упомянутых репозитория.

Я думал, что мог просто зарегистрировать новый экземпляр контейнера IOC Единицы и назвать RegisterInstance на контейнере для каждой передачи фиктивного объекта в Насмешке. Объектное значение для каждого. Я пытаюсь сделать этот процесс регистрации допускающим повторное использование, таким образом, я не должен продолжать делать то же самое много раз с каждым модульным тестом, если модульный тест не требует, чтобы некоторые определенные данные возвратились из репозитория. Это - то, где проблема заключается..., какова лучшая практика для установки математических ожиданий на дразнившем репозитории? Походит, если бы я просто называю RegisterType на контейнере Единицы, что я потерял бы ссылку на фактический Фиктивный объект и не буду в состоянии переопределить поведение.

35
задан Rob Packwood 20 January 2010 в 03:55
поделиться

1 ответ

Установочные тесты не должны вообще использовать контейнер. Инъекция зависимости (DI) поставляется в двух этапах:

  1. используют DI-шаблоны для введения зависимости в потребителей. Вам не нужен контейнер для этого.
  2. На корне композиции используйте диконкурс DI (или плохое человеку), чтобы провести все компоненты вместе.

Как не использовать какой-либо диконкурс для тестирования подразделения

в качестве примера, учитывайте класс, который использует IRePosity1. Используя впрыск конструктора , мы можем сделать зависимость инвариантным классом.

public class SomeClass
{
    private readonly IRepository1 repository;

    public SomeClass(IRepository1 repository)
    {
        if (repository == null)
        {
            throw new ArgumentNullException("repository");
        }

        this.repository = repository;
    }

    // More members...
}

Обратите внимание, что ключевое слово Readonly в сочетании с охранным предложением гарантирует, что поле репозиторий не является NULL, если экземпляр был успешно создан.

Вам не нужен контейнер для создания нового экземпляра MyClass. Вы можете сделать это непосредственно из теста подразделения, используя MOQ или другое тестовое двойное:

[TestMethod]
public void Test6()
{
    var repStub = new Mock<IRepository1>();
    var sut = new SomeClass(repStub.Object);
    // The rest of the test...
}

см. здесь Для получения дополнительной информации ...

Как использовать единство для тестирования подразделения

Однако, если вы Абсолютно необходимо использовать единство в ваших тестах, вы можете создать контейнер и использовать метод regileInstance:

[TestMethod]
public void Test7()
{
    var repMock = new Mock<IRepository1>();

    var container = new UnityContainer();
    container.RegisterInstance<IRepository1>(repMock.Object);

    var sut = container.Resolve<SomeClass>();
    // The rest of the test...
}
60
ответ дан 27 November 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: