2013-03-29 61 views
0

我努力學習單元測試,並具有下列情況下,我都無法避開我的頭:單元測試嘲諷 - 沒有道理對我來說

  1. 我有一個模型:SalesOrder - 在哪些車型訂單電子商務商店
  2. 的SalesOrder有一個稱爲gift_message_id
  3. 禮品消息ID是一個整數值屬性和爲外鍵到GiftMessage模型
  4. 的GiftMessage模型具有能夠採取的順序模型和加載的方法GiftMessage實例正確地基於SalesOrder 。

我想寫一個測試,準確地測試這種行爲,但我結束了2嘲笑:1爲SalesOrder和1爲GiftMessage,它沒有任何意義。我在這裏做錯了什麼?

我想測試的方法是這樣的:

public function loadGiftMessageByOrderModel(SalesOrder $order) 
{ 
    $giftMessageId = $order->getGiftMessageId(); 

    //if the order has a gift message id then load the gift message model and return it 
    if ($giftMessageId !== false) { 
     return new GiftMessage($giftMessageId); 
    } 
    return false; 
} 

這又如何進行單元測試,銘記秩序和禮品報文數據存儲在數據庫中。

+0

我同意,單元測試是一個笑話 – samayo

+0

我認爲它的價值 - 但我只是無法解決如何做到這一點,並使測試值得 –

+0

說實話,我真的不明白你的描述和你究竟想要什麼去測試。一般來說,如果你想測試類X,你可以模擬或實例化所有的外部實體,不管它們有多少。當然,保持鬆耦合的東西在這裏是一個優勢。 –

回答

0

任何時候你有一個調用構造函數的方法,並且在構造函數中完成了非平凡的工作,你就有麻煩了。我從上面看到的最好的選擇是讓上面的類擁有一個GiftMessageFactory實例。然後你可以模擬工廠來驗證它是用適當的值和適當的時間調用的。

0

正如你已經寫了loadGiftMessageByOrderModel函數並解釋了GiftMessage的構造函數,我不認爲你可以很容易地單元測試這段代碼。爲了清楚地測試它,您需要從數據庫加載GiftMessage,方法是構造函數爲而不是。你的構造函數不應該調用與數據庫交互的方法。另一個類或方法應該加載,然後調用構造函數。粗略地說,這樣的事情:

public function loadGiftMessageByOrderModel(SalesOrder $order) 
{ 
    $giftMessageId = $order->getGiftMessageId(); 

    //if the order has a gift message id then load the gift message model and return it 
    if ($giftMessageId !== false) { 
     // $giftMessageLoader handles loading from the DB; it doesn't create a GiftMessage object 
     $giftMessageRecord = $giftMessageLoader.loadById($giftMessageId); 
     // $giftMessageFactory actually calls the constructor to create a GiftMessage 
     return $giftMessageFactory.createFromRecord($giftMessageRecord); 
    } 
    return false; 
} 

然後,可以使你控制什麼從數據庫返回真實嘲笑$giftMessageLoader.loadById電話。您還可以測試$giftMessageFactory適當調用GiftMessage構造函數並創建適當的對象。

這裏的總體教訓是構造函數應該很簡單。他們可以驗證參數,以便對象構建正確,但他們可能不應該調用其他重要的應用程序片段。