簡體   English   中英

TDD和嘲弄

[英]TDD and mocking

首先,我不得不說,我是嘲笑的新手。 所以也許我錯過了一點。

我也剛剛開始習慣TDD方法。

因此,在我的實際項目中,我正在處理業務層中的類,而數據層尚未部署。 我想,這是開始嘲笑的好時機。 我正在使用Rhino Mocks,但我在編寫類本身之前遇到了需要知道類的實現細節的問題。

Rhino Mocks檢查是否實際調用了預期調用的方法。 所以我經常需要知道測試方法首先調用哪個模擬方法,即使它們可以按任何順序調用。 因為我在測試之前經常編寫復雜的方法,因為我知道已經按照調用方法的順序。

簡單的例子:

public void CreateAandB(bool arg1, bool arg2) {
    if(arg1)
        daoA.Create();
    else throw new exception;
    if(arg2)
        daoB.Create();
    else throw new exception;
}

如果我想測試這個方法的錯誤處理,我必須知道首先調用哪個方法。 但我不想在編寫測試時先了解實現細節。

我錯過了什么嗎?

你有2個選擇。 如果該方法應該導致您的類中的某些更改,您可以測試您的方法的結果 那么你可以調用CreateAandB(true,false)然后調用其他方法來查看是否創建了正確的東西。 在這種情況下,您的模擬對象可能是只提供一些數據的存根。

如果doaAdoaB是注入到您的類中的實際創建數據庫或類似數據的對象,您無法驗證測試中的結果,那么您希望測試與它們的交互,在這種情況下,您創建模擬並設置期望,然后調用方法並驗證是否滿足期望。 在這種情況下,您的模擬對象將是模擬並將驗證預期的行為。

是的,你正在測試的實施細節,但你正在測試,如果你的方法正確使用它的依賴,這是你想要的測試,它不是如何使用它們,這是你是不是真正感興趣的細節的細節。

編輯

IDao daoA = MockRepository.GenerateMock<IDao>(); //create mock
daoA.Expect(dao=>dao.Create); //set expectation

...

daoA.VerifyExpectations(); //check that the Create method was called

您可以確保期望按照特定順序發生,但不使用我認為的AAA語法( 源自2009年 ,可能已經發生變化, 編輯在這里看到可能有效的選項 ),但似乎有人開發了一種方法可能允許這里 我從來沒有用過,也無法驗證它。

至於需要知道哪個方法首先被調用,所以你可以驗證異常,你有幾個選擇:

  • 在您的異常中有不同的消息並檢查以確定引發了哪個異常。
  • 除了期待異常之外,還期待對daoA的調用。 如果你沒有接到對daoA的調用,則測試失敗,因為異常必須是第一個。

通常你只需要假物品,而不是嘲笑。 模擬對象用於測試組件交互,通常可以通過直接查詢SUT的狀態來避免這種情況。 模擬的最實際用途是測試與某些外部系統(數據庫,文件系統,Web服務等)的交互,對於其他事項,您應該能夠直接查詢系統狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM