Перемешивание WindsorContainer для проверки регистрации компонента - PullRequest
0 голосов
/ 18 декабря 2018

Я использую Castle.Windsor 4.1.1, и у меня есть такая регистрация:

container.Register(Component.For<IMessageMappingManager>().ImplementedBy<MessageMappingManager>());

Теперь я хочу проверить, хорошо ли работает регистрация, поэтому я смоделировал _container, используя Moq 4.10.0:

_container = new Mock<IWindsorContainer>();

Теперь я хочу проверить регистрацию следующим образом:

_container.Verify(f => f.Register(Component.For<IMessageMappingManager>().ImplementedBy<MessageMappingManager>()), Times.Once);

Или вот так:

_container.Verify(f=>f.Register(It.IsAny<ComponentRegistration<IMessageMappingManager>().ImplementedBy<MessageMappingManager>()>()), Times.Once); 

Но ни один из них не работает.
Кто-нибудь может помочь с этим?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

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

Весь смысл проверить вашу реализацию тестируемой системы.

Тогда ваш единственный тест состоит в том, что произошел вызов с имитируемым объектом.Достаточно легко проверить, что произошла фактическая регистрация.

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

public class EmailInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For(typeof(IResolveApplicationPath))
                .ImplementedBy(typeof(ApplicationPathResolver))
                .LifeStyle.PerWebRequest);

        container
            .Register(Component.For(typeof(IGenerateEmailMessage)).ImplementedBy(typeof(EmailMessageGenerator))
                .LifeStyle
                .PerWebRequest);

        container
            .Register(Component.For(typeof(ISendEmail)).ImplementedBy(typeof(EmailSender))
                .LifeStyle
                .PerWebRequest);

        container.Register(
            Component.For<NotificationConfigurationSection>()
                .UsingFactoryMethod(
                    kernel =>
                        kernel.Resolve<IConfigurationManager>()
                            .GetSection<NotificationConfigurationSection>("notificationSettings")));

    }
}

Тогда мой тест выглядит как

    public class WhenInstallingEmailComponents : SpecificationBase
    {
        private IWindsorContainer _sut;

        protected override void Given()
        {
            _sut = new WindsorContainer();
        }

        protected override void When()
        {
            _sut.Install(new EmailInstaller());
        }

        [Then]
        public void ShouldConfigureEmailSender()
        {
            var handler = _sut
                .GetHandlersFor(typeof(ISendEmail))
                .Single(imp => imp.ComponentModel.Implementation == typeof(EmailSender));

            Assert.That(handler, Is.Not.Null);
        }

        [Then]
        public void ShouldConfigureEmailGenerator()
        {
            var handler = _sut
                .GetHandlersFor(typeof(IGenerateEmailMessage))
                .Single(imp => imp.ComponentModel.Implementation == typeof(EmailMessageGenerator));

            Assert.That(handler, Is.Not.Null);
        }
    }
}

А вот и метод расширения GetHandlersFor

public static class WindsorTestingExtensions
{
    public static IHandler[] GetAllHandlers(this IWindsorContainer container)
    {
        return container.GetHandlersFor(typeof(object));
    }

    public static IHandler[] GetHandlersFor(this IWindsorContainer container, Type type)
    {
        return container.Kernel.GetAssignableHandlers(type);
    }

    public static Type[] GetImplementationTypesFor(this IWindsorContainer container, Type type)
    {
        return container.GetHandlersFor(type)
            .Select(h => h.ComponentModel.Implementation)
            .OrderBy(t => t.Name)
            .ToArray();
    }
}

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

  1. Создание экземпляра вашего контейнера
  2. Вызов установщика для регистрации ваших компонентов.
  3. Проверка контейнера на наличие типов реализации для ваших интерфейсов.

Вот хорошая ссылка из проекта Castle о том, как проверить ваш регистрационный код.

0 голосов
/ 18 декабря 2018

Коллега помог.

Это работает так:

_container.Verify(f => f.Register(It.Is<ComponentRegistration<IMandatorMapper>>(reg => reg.Implementation == typeof(MandatorMapper))), Times.Once);
...