2012-04-08 163 views
2

我申請TDD給我的第一事件中心的項目(CQRS,事件採購等)和我TDD行爲測試正在根據給定,何時,預計Greg Young的的簡單測試框架寫我的測試。我的測試夾具接受命令,命令處理程序和聚合根,然後測試輸出的事件。沒有getter/setter方法

CommandTestFixture<TCommand, TCommandHandler, TAggregateRoot> 

例如這裏是一個典型的測試

[TestFixture] 
public class When_moving_a_group : 
    CommandTestFixture<MoveGroup, MoveGroupHandler, Foo> 

我很高興與整體,但與上面的測試,我已經打了一個問題,這些測試。聚合根包含一組組。命令MoveGroup重新排列集合,從&索引。我設置了測試並聲稱使用正確的數據生成了正確的GroupMoved事件。

作爲一個額外的測試,我需要斷言組合集合的重新排序實際上正確發生了嗎?當聚合根沒有公共getter/setter時,我該如何做到這一點。我可以添加一個方法來檢索特定索引的組,但是這不是簡單的可破解封裝嗎?

這是怎麼回事?

EDIT

的基團的重新排序發生在對總結根GroupMoved處理程序。

private void Apply(GroupMoved e) 
{ 
    var moved = groups[e.From]; 
    groups.RemoveAt(e.From); 
    groups.Insert(e.To, moved); 
} 

回答

1

這裏的摩擦是因爲你想斷言一些關於內部實現的東西,但是你手頭上的東西在頂層。

您的測試和斷言需要處於相同的邏輯級別。有兩種方法重新排列:

重新排序組對最高級別的後續命令或查詢有什麼影響?

這應該給你一個途徑爲斷言正確的結果發生,而無需斷言直接有關的羣體的排序任何東西。這將測試保持在頂層,並允許各種內部重構(例如,可能是對組進行了惰性排序)。

你能在一個較低的水平測試?

如果你覺得上述過於複雜,測試,你可能想在一個更詳細的級別幀測試。我認爲這就像專注於一部分細節,以使其正確。

在此級別(而不是您的組合根)下,接口將知道組,並且您將有機會斷言您想要聲明的內容。

或者,你需要這個測試呢?

如果你不能找到上述任何級別的合適的測試,那麼你肯定需要這個測試呢?如果沒有明顯的外部差異,則不需要通過測試來鎖定行爲。

+0

有趣。目前,排序對後續的命令沒有影響,我可以看到。這僅僅是用戶給予優先考慮的美學改變。我的更新,刪除,編輯命令不會計劃任何狀態,我可以測試,所以我不能使用這些通道。重新進行低級測試時,AR上的句柄方法實際上是重新排序,但我仍然沒有看到如何在當前實現中的較低級別上進行測試。 – madcapnmckay 2012-04-09 03:38:12

+0

@madcapnmckay如果該組未被重新排序,會在您的應用程序中破壞什麼? – 2012-04-09 05:19:03

+0

目前我猜不出什麼。我明白你在說什麼,如果什麼都沒有中斷,爲什麼我們需要一個測試。如果有什麼東西要突破的話,我可以在休息時針對測試。 – madcapnmckay 2012-04-09 05:29:32