2011-04-07 29 views
4

所以,這是交易。我目前正在Ruby on Rails環境中工作,現在已經工作了大約1年。在此之前,我在C++/Java領域工作了近十年。我(仍然)試圖弄清楚在斷言時Ruby方式是什麼。在Ruby生產中使用斷言...是或否?

我並不擔心技術細節。我知道TestUnit具有可以在測試環境中使用的斷言,我知道我可以將自己的斷言方法添加到我的Ruby項目中,並在生產Rails中使用它們來鎖定已知條件。問題是:確保我知道應該/不會發生的代碼中的某些東西的Ruby方式是什麼?

爲了記錄,我一直主張測試和提高生產。我仍然不禁想念我的生產斷言...

謝謝! - = Ahmed = -

回答

4

確實不應該在生產代碼中使用斷言,原因有兩個。

  1. assert x功能非常強,難以閱讀。使用raise/if組合增加了可讀性。

  2. assert並沒有說明如果條件失敗會引發什麼樣的錯誤。雖然,

    raise ObscureButInformitiveError if condition

    讓應用程序層進一步上漲做一些事情relveant。比如給管理員發電子郵件或者寫一個特定的日誌。

+1

只要您安裝了某種'rescue_from'處理程序,爲用戶提供了一個很好的錯誤消息,並且您有類似'hoptoad_notifier'來捕獲和報告錯誤以進行診斷,就可以拋出異常。 – tadman 2011-04-07 20:12:29

+0

現在已經有一段時間了,我認爲這個建議以及像[Airbrake](http://airbrakeapp.com/pages/home)這樣的服務是最好的選擇。 – Ahmish 2011-10-05 13:01:33

1

讓錯誤發生,然後檢查日誌出錯的地方,然後修復它。
Rails自動捕獲所有未捕獲的異常,它只會弄亂髮生錯誤的單個請求。

+0

使用零值時,當該值設置爲零時不立即顯而易見。您有一個異常跟蹤,但只有在無訪問發生後纔會跟蹤。考慮一個變量通過5個方法的情況,每個方法都可以在某些條件下將值設置爲nil。日誌不會包含完整的狀態信息,因此您可能無法獨立重現log + stacktrace中的錯誤。你如何在沒有斷言的情況下降低這種複雜性(或者像某種類似斷言的功能,比如除非;提高錯誤率)? – 2011-04-08 13:03:08

0

在Ruby中沒有官方的非測試斷言,但有寶石。

例如Jim Weirich的Given看起來很有希望。雖然它的主要焦點是測試環境(rspec的/ MINITEST),但它也:

...提供意味着 非測試/非規範代碼中使用3個斷言。例如,這是一個平方根函數 ,其中包含前後條件聲明。

require 'given/assertions' 
require 'given/fuzzy_number' 

include Given::Assertions 
include Given::Fuzzy 

def sqrt(n) 
    Precondition { n >= 0 } 
    result = Math.sqrt(n) 
    Postcondition { result ** 2 == about(n) } 
    result 
end 

要使用 非測試斷言,您需要導入該'given/assertions' 文件,然後包括Given::Assertions模塊到什麼都 類是使用Precondition/Postcondition/Assert方法。這些斷言的代碼塊 應始終爲常規Ruby真/假 值(RSpec的should和expect方法不可用)。

請注意,此示例也使用模糊數字匹配,但斷言本身不需要 。