2010-07-16 45 views
17

我想使用斷言並在我的ruby代碼中放置評估值(例如:檢查是否創建zip文件,標籤存在,文本區域中的消息等)。我已經提出了一些斷言,如assert @selenium.is_text_present(textMessage),但它們不起作用。如何在ruby代碼中放置斷言

請讓我知道是否有任何寶石斷言寶石要安裝。

+2

請確保您已經閱讀了[格式化指南](http://stackoverflow.com/editing-help),通知,我們都始終友好,這就是爲什麼我們跳過通常的「嗨/謝謝」部分的消息,並且 - 歡迎來到StackOverflow! – 2010-07-16 11:23:10

+0

認爲這是類似 - http://stackoverflow.com/questions/147969/is-it-idiomatic-ruby-to-add-an-assert-method-to-rubys-kernel-class – carrutherji 2010-07-16 11:31:44

回答

24

對於簡單的斷言,你可能最好關閉滾動你自己的斷言方法取塊:

ruby-1.9.1-p378 > class AssertionError < RuntimeError 
ruby-1.9.1-p378 ?> end 
=> nil 
ruby-1.9.1-p378 > def assert &block 
ruby-1.9.1-p378 ?> raise AssertionError unless yield 
ruby-1.9.1-p378 ?> end 
=> nil 
ruby-1.9.1-p378 > assert { 1 > 0 } 
=> nil 
ruby-1.9.1-p378 > assert { 5 == 12 } 
AssertionError: AssertionError 
    from (irb):8:in `assert' 
    from (irb):11 
    from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>' 

在copypastastable形式:

class AssertionError < RuntimeError 
end 

def assert &block 
    raise AssertionError unless yield 
end 

i = 1 
assert {i >= 0} 
assert { 5 == 12 } 
+2

是否有使用一個塊作爲參數而不是簡單的布爾值? – 2015-05-26 21:50:09

+0

如果assert方法在執行「raise ...除非yield」之前檢查其他條件(例如'if DEBUG_ENABLED'),那麼如果該條件返回false,則不會調用yield,因此傳入塊永遠不會被評估。如果該塊所花費的代價很高,這可能會對程序執行時間產生很大影響。 – 2016-03-09 12:56:13