Проверка вызова функции на фиктивном объекте, не совпадающем при использовании массива params
У меня есть следующий тест:
[Test]
public void VerifyThat_WhenInitializingTheLoggingInterceptionFacility_TheLoggingInterceptorIsAdded()
{
var kernel = new Mock<IKernel>(MockBehavior.Loose)
{
DefaultValue = DefaultValue.Mock
};
kernel.Setup(k => k.AddFacility<LoggingInterceptionFacility>())
.Returns(kernel.Object)
.Callback(() => ((IFacility)new LoggingInterceptionFacility()).Init(kernel.Object, Mock.Of<IConfiguration>()));
kernel.Setup(k => k.Register(It.IsAny<IRegistration[]>()))
.Returns(kernel.Object)
.Verifiable();
kernel.Object.AddFacility<LoggingInterceptionFacility>();
kernel.Verify(k => k.Register(It.Is<IRegistration[]>(r => r.Contains(Component.For<LoggingInterceptor>()))));
}
Как вы можете видеть, я издеваюсь над реальным поведением ядра, вызывая Init(IKernel, IConfiguration)
метод, который в свою очередь вызывает защищенный Init()
метод.
Вот как выглядит защищенный Init():
protected override void Init()
{
Kernel.ProxyFactory.AddInterceptorSelector(new LoggingModelInterceptorsSelector());
Kernel.Register(Component.For<LoggingInterceptor>());
}
Я ожидал, что проверка пройдет, но это не так. Если я проверю, что Kernel.Register был вызван вообще с It.IsAny<LoggingInterceptor>()
тест проходит.
Что я не соответствую прямо здесь? Есть ли способ сделать этот тест успешным?
1 ответ
Похоже, вы слишком много тестируете здесь. Вы эффективно реализуете множество внутренних функций Виндзора, передавая по телефону AddFacility
в LoggingInterceptionFacility.Init
,
Все, что вам действительно нужно для проверки, это тот факт, что ваше учреждение звонит Register
на ядре и предположим, что Виндзор делает правильные вещи. В конце концов, у него есть свои собственные тесты;)
После этого тест становится намного более читабельным, что я считаю наиболее важным аспектом.
[Test]
public void VerifyThat_WhenInitializingTheLoggingInterceptionFacility_TheLoggingInterceptorIsAdded()
{
var kernel = new Mock<IKernel>();
kernel.Setup(k => k.Register(It.IsAny<IRegistration[]>()))
.Returns(kernel.Object)
.Verifiable();
//Explicit interface implementation requires casting to the interface
((IFacility)new LoggingInterceptionFacility()).Init(kernel.Object, Mock.Of<IConfiguration>().Object);
//verify the type of registration here
kernel.Verify(k => k.Register(It.Is<IRegistration[]>(r => r[0] is ComponentRegistration<LoggingInterceptor>);
}
РЕДАКТИРОВАТЬ Звонки в Component.For
вернуть разные экземпляры между установкой и выполнением. Я обновил код, чтобы отразить это, и проверил проверку типа компонента.