Модульный тест из вашего ответа ничего не проверяет.Первая проблема заключается в том, что вы проверяете свою тестируемую систему.
Весь смысл проверить вашу реализацию тестируемой системы.
Тогда ваш единственный тест состоит в том, что произошел вызов с имитируемым объектом.Достаточно легко проверить, что произошла фактическая регистрация.
В этом примере используются установщики, поскольку я использую их для очистки большого количества регистрационного кода.
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, но вы должны понимать, что происходит.
- Создание экземпляра вашего контейнера
- Вызов установщика для регистрации ваших компонентов.
- Проверка контейнера на наличие типов реализации для ваших интерфейсов.
Вот хорошая ссылка из проекта Castle о том, как проверить ваш регистрационный код.