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>()))));
}
正如你看到的,我通過調用嘲諷內核的實際行爲facilitiy的Init(IKernel, IConfiguration)
方法,依次調用受保護的方法Init()
。
這裏是保護的init()的樣子:
protected override void Init()
{
Kernel.ProxyFactory.AddInterceptorSelector(new LoggingModelInterceptorsSelector());
Kernel.Register(Component.For<LoggingInterceptor>());
}
我預期的驗證會通過,但它沒有。如果我通過It.IsAny<LoggingInterceptor>()
確認Kernel.Register被調用,測試通過。
我在這裏不匹配什麼?有沒有辦法讓這個測試通過?
你錯了。首先你不能直接調用Init(IKernel,IConfiguration)。你必須投身於IFacility才能做到這一點。其次,我正在隔離溫莎的行爲。它是否正確寫入並不重要,我自然而然地使用它,就像打算使用的用例一樣。但是我不知道Component.For返回的對象沒有實現==或Equals()。我對你的答案在這裏有複雜的感受。 – 2011-05-18 07:11:29
'Component.For'是一個工廠,每次都會返回一個新的實例。默認情況下,對象通過引用進行比較,並且由於它們不是不可變的值對象,所以它們不會覆蓋Object.Equals來進行值比較。 – 2011-05-18 07:23:49
不,您測試的所有內容都是在測試方法開始時您已經正確反轉了工程的Castle Windsor代碼。如果你想要一個更好的集成測試,把Castle當作黑箱,不要嘲笑它,設置你的記錄器,然後驗證它是否記錄了事情。這樣你就可以驗證整個解決方案的工作。 – 2011-05-18 07:30:26