爲了使一個具體的例子,我有PromoCode
聚合根是由PromoCodeUsage
實體,僅由AR控制,以便在AR一些方法只是委託給該實體,如:如何測試將其調用委託給AR實體的Aggregate Root的方法?
public function useFor(Order $order): void
{
$this->promoCodeUsage->useFor($order);
}
有些他們被部分下放,如:
public function applyFor(Order $order): void
{
if (!$this->published) {
throw new NotPublishedPromoCodeCanNotBeApplied();
}
$this->promoCodeUsage->applyFor($order);
}
我的測試套件完全覆蓋,包括PromoCodeUsage
功能的所有PromoCode
行爲,因爲在那個迭代沒有PromoCodeUsage
和所有的邏輯在混合。然後我重構了一些邏輯到PromoCodeUsage
。這個測試套件爲PromoCode
進行了很多測試,我很高興我也可以分解它(但它在分割實體後仍然運行良好)。所以我創建了另一個測試套件(PromoCodeUsageTest
),我從PromoCode移動了部分測試。
但是PromoCodeUsageTest
s正在測試PromoCodeUsage
實體通過PromoCode
的行爲,就像它在拆分前的原始測試中一樣。他們不直接觸摸PromoCodeUsage
。現在我有PromoCodeTest
套房設有: 而PromoCodeUsageTest套房設有:
但它是有點怪異,即1)PromoCodeTest
我省略了一些測試(在別處)和2)PromoCodeUsageTest
我其實不觸摸PromoCodeUsage
實體。 3)我使用Roy Osherove的模板進行測試命名,我不知道應該在測試名稱中使用什麼方法名稱 - 從PromoCode或PromoCodeUsage?在我的情況下,他們是相同的,但他們可能會有所不同,這個想法有味道
如果我重寫PromoCodeUsageTest
s到直接測試PromoCodeUsage
實體,我結束了在PromoCode
一些未覆蓋的方法(即只是委託給PromoCodeUsage
)。所以這讓我回到我的方法來測試PromoCodeUsage
到PromoCode
AR。
Bob叔叔(和其他人)說,測試行爲而不是API是很好的做法。我的方法是否符合?
因爲我的方法感覺有些異味,對嗎?如何做得更好?
http://stackoverflow.com/a/153565/54734 – VoiceOfUnreason
*「在PromoCodeUsageTest我實際上沒有觸及PromoCodeUsage實體」* - 甚至在斷言? – guillaume31
@ guillaume31不,我通過AggregateRoot斷言。而且,我並沒有太多斷言,我寧願沒有斷言知道,當我已經測試了引發預期異常的所有情況時,可以在不拋出異常/錯誤的情況下執行該操作。因爲我發現,我需要在我的實體上擁有getter才能執行這些斷言,我認爲這是不好的,不僅僅是因爲只有測試方法,而是因爲我會測試API而不是行爲。 – Tom