Ответ 1
Единичные тесты не должны использовать контейнер вообще. Инъекция зависимостей (DI) происходит в два этапа:
- Используйте шаблоны DI для встраивания зависимостей в потребителей. Для этого вам не нужен контейнер.
- В приложении Root of Composition используйте контейнер DI (или Bad Man DI) для соединения всех компонентов.
Как вообще не использовать какой-либо контейнер DI для модульного тестирования
В качестве примера рассмотрим класс, который использует IRepository1. Используя шаблон Конструктор 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
не равно null, если экземпляр был успешно создан.
Вам не нужен контейнер для создания нового экземпляра MyClass. Вы можете сделать это непосредственно из unit test с помощью Moq или другого тестового двойника:
[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...
}