2011-11-25 97 views
2

我需要一些幫助,爲使用Rhino Mocks 3.5的以下課程編寫單元測試。在我的課下overrided方法:協助編寫單元測試與犀牛模擬的方法

public override void Initialize(params object[] messages) 
    { 
     var data = new ViewData 
     { 
      Name = this.GetName() 
     }; 

     this.Notify(data); 
    } 

我想編寫一個測試來驗證,當初始化方法被調用時,方法調用的通知方法,具有類型的ViewData的參數。另外我想檢查一下這個方法中調用的是一個私有方法的GetName方法。我使用訪問者來訪問GetName私有方法。

,因爲我是新來編寫測試和需要幫助任何幫助將是巨大的與此有關。

+0

'Notify()'做了什麼方法?它是否以某種方式訪問​​在此類中注入的其他類? – sll

+0

GetName()和Notify()是什麼簽名?如果Notify只接受ViewData,則不需要編寫單元測試來驗證該參數的類型爲ViewData - .NET將在編譯時爲您執行該操作。 – PatrickSteele

回答

3

你想要什麼叫做partial mock

[Test] 
public void UsingPartialMocks() 
{ 
    MockRepository mocks = new MockRepository(); 
    YourClass partialMock = mocks.PartialMock<YourClass>(); 
    Expect.Call(partialMock.Notify(null)).IgnoreArguments(); 
    mocks.ReplayAll(); 
    partialMock.Initialize(null); 
    mocks.VerifyAll(); 
} 
+0

感謝您的幫助喬恩,但當我嘗試上述我得到的錯誤:無效的調用,最後的調用已被使用或沒有調用(確保您調用虛擬(C#)/ Overridable(VB)方法)。 notify方法不是在被測試的類中實現的,而是在由我正在測試的類繼承的基類中實現的。任何想法可能是什麼問題? – amateur

+0

您可以嘗試使用lambda語法 - 請參閱http://stackoverflow.com/questions/1301116/rhino-mocks-error-invalid-call-the-last-call-has-been-used-or-no-call- has-be –

+0

我將上面的行更改爲Expect.Call(()=> partialMock.Notify(null))。IgnoreArguments();但仍然遇到同樣的錯誤 - 任何想法? – amateur

0

雖然沒有直接回答你關於如何使用犀牛做的問題(似乎喬恩在這個已經做了體面的工作),爲子孫後代着想,我會告訴我如何使用手動嘲諷測試。 (多多包涵,它已經有一段時間,因爲我做了C#,所以原諒了語法錯誤)

[Test] 
public void initializeRegistersViewDataWithGivenName() 
{ 
    ShuntedYourClass yourClass = new ShuntedYourClass(); 
    yourClass.initialize(/* arg list */); 

    // Verify 'Notify' was called 
    Assert.NotNull(yourClass.registeredViewData); 

    // Verify 'GetName' private method was invoked and 
    // 'Name' was properly populated 
    Assert.AreEqual("expected name", yourClass.registeredViewData.Name); 
} 

// Nested class for testing purposes only. 
class ShuntedYourClass : public YourClass 
{ 
    public ViewData registeredViewData; 

    public override void Notify(ViewData vd) 
    { 
    this.registeredViewData = vd; 
    } 
} 

此代碼現在驗證Initialize方法確實正常工作和執行Notify用適當的參數。

希望有幫助!

Brandon