2013-07-15 101 views
0

我創建了一個服務對象(http://railscasts.com/episodes/398-service-objects),它基本上創建了兩個模型A和B,它們建立它們之間的關係,其中B屬於A,並返回A(這又可以訪問B通過一個給定的協會)。返回無效的測試模型

錯誤,我返回一個散列與錯誤信息。正如我試圖測試這種方法,我現在有一個問題,現在有兩種可能的返回類型:一個模型(當它通過)或一個散列與錯誤信息。

這是一個設計錯誤的信號?我知道你什麼時候第一次測試(TDD)可以避免這樣的設計問題。

如果是問題,那麼我知道我需要返回一個無效的A模型。假設模型B在創建時拋出一個錯誤,我將如何仍然能夠返回一個無效的A模型?

如果返回一個錯誤散列沒問題,那我怎麼能設計這個方法來測試友好?

回答

1

良好的洞察力和很好的問題。 :-)面對它,這似乎是一個很好的情況,爲「錯誤」情況引發Ruby異常,而不是作爲方法調用的結果返回爲散列。您可以定義自己的錯誤類(可能應該是StandardError的子類),幷包含散列或任何您想要的信息,作爲您提出的錯誤的一部分。有關此一般主題的討論,請參閱http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html

至於檢查rspec中引發的錯誤,請參閱How to use RSpec's should_raise with any kind of exception?的最後一個回答,包括指向其他​​信息的鏈接。

如果您想將您的API作爲REST風格的界面展示,那麼共識似乎是利用HTTP響應代碼來呈現異常,如How to handle REST Exceptions?中所述如果您確實使用例外響應代碼(例如40X)呈現你的例外,那麼你在這種情況下返回一個散列,在另一個情況下返回一個模型並不是一種難聞的氣味,因爲沒有期望在伴隨錯誤的數據和隨附的數據之間保持一致成功的回報。無論如何,我認爲在錯誤情況下返回一個「無效」模型是沒有任何意義的,假設你在這種情況下實際上不創建/保持模型。

+0

感謝您的回覆。我正在構建一個API,並且無法承受引發Ruby異常/錯誤的問題,因爲我需要以JSON方式優雅地將錯誤返回給用戶。你會在這種情況下建議什麼? – darksky

+0

查看最新答案的最後一段。 –

+0

是的,我已經在我的控制器中這樣做了。我的服務返回一個有效的模型(在這種情況下,控制器正常繼續)或者表示錯誤的哈希(在這種情況下拋出HTTP響應代碼錯誤等)。在這種情況下,我的服務可以返回散列或有效模型,還是應該嘗試查看是否可以返回例如無效模型?如果模型B是無效模型(請參閱上面的問題B)? – darksky

0

您可以測試結果的類型。

在rspec的...

expect(actual).to be_an_instance_of(expected) 
expect(actual).to be_a_kind_of(expected) 
+0

是的,我知道。這不是一個標誌,這是設計不佳嗎? – darksky