[英]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)
然后調用其他方法來查看是否創建了正確的東西。 在這種情況下,您的模擬對象可能是只提供一些數據的存根。
如果doaA
和doaB
是注入到您的類中的實際創建數據庫或類似數據的對象,您無法驗證測試中的結果,那么您希望測試與它們的交互,在這種情況下,您創建模擬並設置期望,然后調用方法並驗證是否滿足期望。 在這種情況下,您的模擬對象將是模擬並將驗證預期的行為。
是的,你正在測試的實施細節,但你正在測試,如果你的方法正確使用它的依賴,這是你想要的測試,它不是如何使用它們,這是你是不是真正感興趣的細節的細節。
編輯
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年 ,可能已經發生變化, 編輯在這里看到可能有效的選項 ),但似乎有人開發了一種方法可能允許這里 。 我從來沒有用過,也無法驗證它。
至於需要知道哪個方法首先被調用,所以你可以驗證異常,你有幾個選擇:
通常你只需要假物品,而不是嘲笑。 模擬對象用於測試組件交互,通常可以通過直接查詢SUT的狀態來避免這種情況。 模擬的最實際用途是測試與某些外部系統(數據庫,文件系統,Web服務等)的交互,對於其他事項,您應該能夠直接查詢系統狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.