2011-05-15 19 views
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被調用,測試通過。
我在這裏不匹配什麼?有沒有辦法讓這個測試通過?

回答

3

看來你在這裏測試的方式太多了。通過管理從AddFacilityLoggingInterceptionFacility.Init的呼叫,您正在有效地重新佈置很多Windsor的內部部件。

所有的你真的需要測試的事實是,你的設施在內核上調用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返回不同的實例。我更新了代碼以反映並驗證組件的類型。

+0

你錯了。首先你不能直接調用Init(IKernel,IConfiguration)。你必須投身於IFacility才能做到這一點。其次,我正在隔離溫莎的行爲。它是否正確寫入並不重要,我自然而然地使用它,就像打算使用的用例一樣。但是我不知道Component.For返回的對象沒有實現==或Equals()。我對你的答案在這裏有複雜的感受。 – 2011-05-18 07:11:29

+0

'Component.For'是一個工廠,每次都會返回一個新的實例。默認情況下,對象通過引用進行比較,並且由於它們不是不可變的值對象,所以它們不會覆蓋Object.Equals來進行值比較。 – 2011-05-18 07:23:49

+0

不,您測試的所有內容都是在測試方法開始時您已經正確反轉了工程的Castle Windsor代碼。如果你想要一個更好的集成測試,把Castle當作黑箱,不要嘲笑它,設置你的記錄器,然後驗證它是否記錄了事情。這樣你就可以驗證整個解決方案的工作。 – 2011-05-18 07:30:26