0

次のテストがあります。

[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>()テスト パスでまったく呼び出されたことを確認した場合。
ここで一致しないものは何ですか? このテストに合格する方法はありますか?

4

1 に答える 1

3

ここであまりにも多くのことをテストしているようです。AddFacilityからへの呼び出しをパイプすることにより、Windsor の内部の多くを効果的に再実装していLoggingInterceptionFacility.Initます。

実際にテストする必要があるのは、施設がカーネルを呼び出し、RegisterWindsor が正しいことを行うと仮定するという事実だけです。結局のところ、独自の単体テストがあります ;)

それを行った後、テストははるかに読みやすくなり、これが最も重要な側面だと考えています。

[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セットアップと実行の間で異なるインスタンスを返すためのEDIT呼び出し。それを反映するようにコードを更新し、検証でコンポーネントのタイプをチェックしました。

于 2011-05-18T06:21:41.310 に答える