[英]Unit Testing Order of Operations
假設我們要做牛排。
Public class Restaurant{
public void MakeSteak(Steak rawSteak) {
this.KitchenServices.AddSeasoning(rawSteak);
this.KitchenServices.Grill(rawSteak);
}
}
在單元測試中,我可以確保給定一份生牛排,然后將其調味並燒烤:
public void MakeSteakTest() {
var rawSteak = new Steak();
this.restaurant.MakeSteak(rawSteak);
this.KitchenServices.Verify(x => x.AddSeasoning(rawSteak) , Times.Once);
this.KitchenServices.Verify(x => x.Grill(rawSteak) , Times.Once);
}
我的問題是,我們應該進行測試以確保牛排在燒烤后沒有調味嗎? 如果是,如何?
一般來說 ,你應該測試結果 ,而不是在執行單元測試。 如果更改了MakeSteak
,以使操作按照不同的順序進行,系統中會發生什么? 那是可觀察的東西嗎? 由於您唯一的輸入是Steak
對象,如果在AddSeasoning
之前AddSeasoning
Grill
,是否有某種驗證會失敗? 那就是你應該測試的東西。
一種方法是將每個操作表示為對牛排進行操作的命令對象,例如
interface ISteakOp {
void DoTo(Steak s);
}
class AddSeasoningOp : ISteakOp { ... }
class GrillOp : ISteakOp { ... }
然后返回一系列操作:
public List<ISteakOp> MakeSteakOps() {
return new List<ISteakOp> {
new AddSeasoningOp(),
new GrillOp()
};
}
那么您的測試可以斷言在進行任何調味之前都會進行任何燒烤操作:
var ops = MakeSteakOps();
var grillIndex = ops.IndexOf(o => o is GrillOp);
if (grillIndex != -1) {
var seasonIndex = ops.IndexOf(o = o is AddSeasoningOp);
Assert.That(seasonIndex == -1 || seasonIndex < grillIndex);
}
我的問題是,我們應該進行測試以確保牛排在燒烤后沒有調味嗎?
第一:它對最終用戶/利益相關者可見的行為有影響嗎?他們在乎嗎?
如果是,如何?
然后:
這聽起來可能太“簡單” /“過於簡單”,但是我非常認真。 那就是適當的行為測試的定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.