Как я могу выполнить модульное тестирование, чтобы Windsor мог разрешать зависимости контроллера Asp.net MVC3? - PullRequest
4 голосов
/ 09 апреля 2011

В настоящее время у меня есть фабрика контроллеров Windsor, которая работает хорошо.Однако я немного меняю свои контроллеры и заставляю Виндзор создавать дополнительные данные для контроллеров.Я забыл обновить свой класс установщика, и он не удался.

Таким образом, я понял, что это идеальный экземпляр для модульного тестирования, поэтому каждый раз, когда я запускаю свои модульные тесты, он проверяет, что Windsor настроен правильно.*

Таким образом, я создал следующий модульный тест:

    [TestMethod]
    public void Windsor_Can_Resolve_HomeController_Dependencies()
    {
        // Setup
        WindsorContainer container = new WindsorContainer();

        // Act
        HomeController controller = (HomeController)container.Kernel.Resolve(typeof(HomeController));
    }

Это точно такой же код, который существует в моем методе WindsorControllerFactory.GetControllerInstance(), поэтому я не уверен, почему это не работает.Когда это работает, я получаю:

Test method MyApp.Tests.Controllers.HomeControllerTest.Windsor_Can_Resolve_HomeController_Dependencies threw exception: 
Castle.MicroKernel.ComponentNotFoundException: No component for supporting the service MyApp.Controllers.HomeController was found

Я не уверен, как справиться с этим.Единственное, о чем я могу думать, это то, что, поскольку он находится в моем тестовом проекте, а не в моем проекте Asp.net MVC, он не может автоматически выбирать мой класс CommandAndQueryInstaller, который содержит все мои регистрации типа windsor.

Какой совет по модульному тестированию конфигурации зависимости виндзора?

1 Ответ

5 голосов
/ 09 апреля 2011

Вы создаете новый WindsorContainer в своей настройке и не регистрируете никаких зависимостей в контейнере. Вам нужно будет запустить IWindsorInstallers, чтобы заполнить контейнер.

[TestMethod]
public void Windsor_Can_Resolve_HomeController_Dependencies()
{
    // Setup
    WindsorContainer container = new WindsorContainer();
    container.Install(FromAssembly.Containing<HomeController>());

    // Act
    HomeController controller = container.Resolve<HomeController>();
}

Обратите внимание, что вам не нужно обращаться к ядру. Вы можете использовать container.Resolve (), который также выполняет внутреннюю обработку приведения.

...