Юнит тесты не должны использовать контейнер вообще. Внедрение зависимостей (DI) происходит в два этапа:
- Использование шаблонов DI для внедрения зависимостей в потребителей. Вам не нужен контейнер для этого.
- В корне композиции приложения используйте контейнер DI (или DI бедного человека), чтобы соединить все компоненты вместе.
Как вообще не использовать какой-либо DI-контейнер для модульного тестирования
В качестве примера рассмотрим класс, который использует IRepository1. Используя шаблон Constructor Injection , мы можем сделать зависимость инвариантом класса.
public class SomeClass
{
private readonly IRepository1 repository;
public SomeClass(IRepository1 repository)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
this.repository = repository;
}
// More members...
}
Обратите внимание, что ключевое слово readonly
в сочетании с предложением Guard гарантирует, что поле repository
не равно нулю, если экземпляр был успешно создан.
Вам не нужен контейнер для создания нового экземпляра MyClass. Вы можете сделать это непосредственно из модульного теста, используя Moq или другой Test Double:
[TestMethod]
public void Test6()
{
var repStub = new Mock<IRepository1>();
var sut = new SomeClass(repStub.Object);
// The rest of the test...
}
См. здесь для получения дополнительной информации ...
Как использовать Unity для модульного тестирования
Однако, если вам абсолютно необходимо использовать Unity в своих тестах, вы можете создать контейнер и использовать метод RegisterInstance:
[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...
}