我想了解國家基礎/交互測試的定義(讀福勒的東西,等等)。我發現我開始基於狀態,但一直在做更多的交互,我對如何測試某些東西感到困惑。國家/互動測試和混亂的混合(或濫用)他們
我在MVC控制器和行動電話服務拒絕包:
public ActionResult Deny(int id)
{
service.DenyPackage(id);
return RedirectToAction("List");
}
這似乎清晰。提供模擬服務,驗證它是否正確調用,完成。
現在,我有一個觀點,即讓用戶的證書與包關聯的動作:
public ActionResult Upload(int id)
{
var package = packageRepository.GetPackage(id);
var certificates = certificateRepository.GetAllCertificates();
var view = new PackageUploadViewModel(package, certificates);
return View(view);
}
這一次我有點難倒。我正在做Spec樣式測試(可能不正確),所以爲了測試這個方法我有一個類,然後是兩個測試:驗證包調用庫被調用,驗證證書庫被調用。我其實想要第三個測試來驗證構造函數被調用,但不知道該怎麼做!我得到的印象是完全錯誤的。
因此對於基於狀態的測試中,我將通過在ID,然後測試的ActionResult的看法。好的,這是有道理的。但是我不會對PackageUploadViewModel構造函數進行測試嗎?因此,如果我對構造函數進行了測試,那麼我的一部分只是想驗證我是否調用構造函數,並且返回的操作符合構造函數返回的內容。
現在,我可以想到的另一個選項是我有一個PackageUploadViewModelBuilder(或者同樣愚蠢地命名的)依賴於這兩個存儲庫,然後我只是將該ID傳遞給CreateViewModel方法或其他東西。然後,我可以嘲笑這個對象,驗證一切,並開心。但是......好吧......看起來很奢侈。我正在做一些簡單的事情......並不簡單。另外,controller.action(id)返回builder.create(id)好像無故添加一個圖層(控制器負責構建視圖模型..對吧?)
我不知道...我在想更多基於狀態的測試是必要的,但我怕如果我開始測試的返回值那麼如果A法可以得到所謂的在8個不同的上下文中,我將有一個測試爆炸了大量的重複。我一直在使用基於交互測試,通過一些這些上下文方法B,使所有我需要做的就是驗證方法A調用方法B和我有方法B測試,因此方法A可以只相信那些上下文處理。所以基於交互的測試正在構建這種測試層次結構,但基於狀態的測試將會使測試層次更加平滑。
我不知道如果作出任何意義。
哇,這是長...
耶啓發式,拒絕的例子是超級清楚,我應該測試的相互作用。上傳一個是讓我困惑的東西。我在xUnit模式(它顯然很龐大,我害怕我會買它並且沒有閱讀它)的圍欄上,但推薦可能是值得的。有一件事,這可能只是一個細節,但爲了測試上傳一個(這讓我意識到Action是一個可怕的名字......重構時間),我可以(a)手動創建測試視圖,並驗證兩個視圖是否相等,或者(b)測試視圖上的每個屬性等於它應該是什麼。優先? – anonymous 2009-08-19 17:04:34
@eyston:Roy Osherove的着作「單元測試的藝術」是一個很好的選擇,如果你害怕另一個人現在太大了一口 - 但你仍然應該計劃在晚些時候閱讀它。 – 2009-08-19 17:47:58
@eyston:不管你是決定簡單地比較兩個視圖還是所有的屬性,你通常都會做一個邏輯斷言。如果你可以簡單地比較兩個複雜對象,那麼這很容易,但只有當類以正確的方式覆蓋Equals時纔有可能。無論您是否想要,都應根據您希望如何對API進行建模來做出決定。換句話說:不要僅僅爲了測試而覆蓋Equals,但是如果您已經以所需的方式覆蓋了Equals,那麼您絕對可以使用它來做出斷言。 – 2009-08-19 17:51:44