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

Другие вопросы по тегам