2013-08-02 50 views
0

我想找出最好的方法來斷言,我應該創建一個對象與我應該返回並檢查它等於預期的結果?單元測試:如何斷言?斷言返回的結果或在模擬上調用方法?

或者我應該運行一個反對模擬的方法來確保實際調用該方法。

我已經看到這兩種方式,我想知道如果任何人有任何最佳做法。

當然它更快,更容易編寫單元測試,以斷定方法被調用的模擬,但更快,更容易並不總是最好的方式 - 雖然有時也可以是。

什麼是每個人都斷言上,一個方法被調用或斷言被返回的結果?

當然在單元測試,所以也許答案是實際斷言結果和做多1個斷言它不是最佳實踐的方法被調用?所以我會創建2個單元測試,1來檢查結果,1來檢查該方法是否被調用。

但是現在考慮這個,也許這就是過猶不及,如果我得到我想我可以假設,我的模擬方法被調用的結果。

我真的很感激這方面的一些反饋意見。

在此先感謝。

+0

這些不是相互排斥的關注。你可以做一個,其他或兩個。 –

回答

1

在測試之間,一個方法已經被調用和測試,它返回值是另一個可能更重要的測試:即它被稱爲用正確的參數。

這些天將的方法你編寫

一個非常普遍的情況下,使用一些HTTP庫從一個REST API獲取數據。您不希望在測試中實際發出HTTP請求,因此您可以模擬HTTP客戶端get()方法。一方面,你的模擬可能只是迴歸一樣(在Ruby中使用的RSpec爲例)一些罐頭JSON響應:

http_mock.stub(:get).and_return('{result: 5}') 

然後您測試您能正確解析這一點,並返回基於響應一些正確的值。

您也可以測試HTTP get()方法被調用,但使用正確的參數測試它的名稱爲更重要。在API的情況下,您的方法可能必須使用查詢參數來格式化URL,並且您需要測試它是否正確。斷言看起來是這樣的(使用RSpec再次):

http_mock.should_receive(:get).with('http:/example.com/some_endpoint?some_param=x') 

這個測試是真的到了前面的測試的先決條件,而只是爲了測試該get()被稱爲不會太大確認。例如,它會告訴你,如果你錯誤地設置了URL的格式。

0

你應該兩個都做,這取決於你真正想測試什麼。有幾種類型,你應該在單元測試可以斷言反對要求:

  1. 的動作(給出一些參數)給出正確的結果
  2. 的動作(給出了一些參數)做(或沒有)拋出預期的異常
  3. 某個操作會使您的被測單元以正確的方式與依賴項進行內部通信。

這裏有所有不同的要求,很多時候,對於一個方法來測試其中的幾個或全部是可行的(例如#3,如果被調用的方法沒有依賴關係,等等)

例如:包裝預訂日曆的第三方REST api的類可能取決於某種類型的HTTP客戶端。給定預訂方法,我們可以考慮以下測試(除其他外):

  • 試圖預訂非開放時段會給出一些結果,說明時間已到。
  • 當發送預訂請求,該請求被序列化到JSON和在HTTP請求(prefereably一些測試檢查它的正確的端點以及)

第一個測試是的請求主體發送更關注結果,第二關於你們班之間的溝通。兩者都是您系統的重要組成部分。我喜歡讓測試驅動我的設計,所以我通常最終會立刻爲兩者編寫測試。我發現如果你在面試後測試這樣的類,那麼要麼A)寫一些瑣碎的超級測試來測試太多東西並且不是很有用,或者B)只是簡單地省略測試一些功能,在你盾牌的洞中進行迴歸測試。

雖然有時候最好不要過多地測試類間通信。如果您不小心,可能會導致測試和類的實現細節之間的緊密耦合。這是不可取的。儘量讓你的工作單位成爲黑匣子。實際上,這意味着試圖查看代碼的哪些部分對於您的方法來說在算法上是基本的,因此不太可能改變,哪些部分看起來像是這樣,但您可能想稍後改變它。這可能很難,但這是你練習的一部分。

相關問題