Интеграционные тесты NUnit и внедрение зависимостей - PullRequest
5 голосов
/ 14 октября 2010

В настоящее время я использую Castle Windsor версии 2.1 в качестве своего контейнера и хотел бы выполнить интеграционные тесты с использованием зарегистрированных в нем сервисов.

В настоящее время я делаю это, используя Common ServiceЛокатор для извлечения моего экземпляра сервиса и выполнения моих интеграционных тестов на нем следующим образом:

var myService = ServiceLocator.Current.GetInstance<IMyService>();
// do stuff with myService

В идеале мне бы хотелось, чтобы мои сервисные зависимости автоматически вводились в мое тестовое устройство NUnit.Spring, кажется, предлагает эту функциональность , но я не могу найти ничего подобного, используя Castle.

Может кто-нибудь указать мне правильное направление?

Редактировать:

Я уверен, что у всех есть (действительные) баллы о том, является ли это хорошей идеей;давайте просто предположим, что именно в этом сценарии ... Может кто-нибудь сказать мне, как это может быть достигнуто с помощью Виндзора?

Ответы [ 2 ]

5 голосов
/ 14 октября 2010

Если вы приедете в Виндзор с Spring / Spring.net, вы обнаружите, что есть ряд вещей, с которыми эти проекты не согласны.Это одна из них.Как адвокат Виндзора, я бы никогда не использовал что-то вроде SpringDstractPependencyInjectionSpringContextTests.Впрыскивать вещи в тест просто кажется неправильным, но опять же, как я уже сказал, я предвзят.

Если вы хотите провести интеграционный тест, просто создайте новый экземпляр контейнера, добавьте все необходимые компоненты,и запустите все, что вы хотите протестировать, например:

[Test]
public void TestComponentThatDependsOnA() {
  var container = new WindsorContainer();
  container.Register(Component.For<MyComponentA>());
  container.Register(Component.For<ComponentThatDependsOnA>());
  var a = container.Resolve<ComponentThatDependsOnA>();
  var result = a.DoSomething();
  Assert.AreEqual("ok", result);
}

Если у вас есть регистрации, аккуратно упакованные в установщики (как вы должны), вы можете использовать их в своих тестах, делая тесты более краткими.

Если у вас есть XML-конфигурация, вы можете легко загрузить ее с помощью Configuration.FromXmlFile ().

Кроме того, здесь нет необходимости использовать Common Service Locator.

Для некоторых интеграционных тестов также полезен контейнер для автоматической имитации , который будет автоматически макетировать сервисы (если, конечно, вы не переопределите их для конкретных).

0 голосов
/ 19 мая 2011

Я думаю, вы тоже можете сделать это с Каслом.Windsor Installer - это универсальный интерфейс, который можно использовать для инициализации компонентов контейнера / регистра.Затем вы можете реализовать этот интерфейс столько раз, сколько вам нужно, в зависимости от контекста, в котором выполняется приложение. У вас может быть один установщик, который внедряет реальные объекты в производственный контекст, и другой установщик, который вводит фиктивные объекты / двойники теста для интеграционных тестов.

Вы можете найти больше информации на http://docs.castleproject.org/Windsor.Installers.ashx

...