簡體   English   中英

在Ruby的Kernel類中添加assert()方法是否是慣用的Ruby?

[英]Is it idiomatic Ruby to add an assert( ) method to Ruby's Kernel class?

我通過在Ruby中編碼等效於Kent Beck的xUnit來擴展我對Ruby的理解。 Python(由Kent編寫)以廣泛使用的語言提供了assert()方法。 Ruby沒有。 我認為添加它應該很容易,但是內核是否適合放置它?

順便說一句, 我知道Ruby中存在各種Unit框架 -這是一種學習Ruby習慣用法的練習,而不是“完成某些工作”。

不,這不是最佳做法。 Ruby中對assert()的最好類比只是在提高

 raise "This is wrong" unless expr

如果您想提供更具體的異常處理,則可以實現自己的異常

我認為在Ruby中使用斷言是完全有效的。 但是您提到的是兩件事:

  • xUnit框架使用assert方法檢查您的測試期望。 它們只能在測試代碼中使用,而不能在應用程序代碼中使用。
  • 諸如C,Java或Python之類的某些語言包含一個assert構造,旨在在程序代碼中使用它們,以檢查您對它們的完整性所做的假設。 這些檢查建立在代碼本身內部。 它們不是測試時實用程序,而是開發時實用程序。

我最近寫了solid_assert:一個小的Ruby庫,實現了Ruby斷言實用程序,並且在我的博客中發表了一篇文章,解釋了它的動機 ..它使您可以以下形式編寫表達式:

assert some_string != "some value"
assert clients.empty?, "Isn't the clients list empty?"

invariant "Lists with different sizes?" do
    one_variable = calculate_some_value
    other_variable = calculate_some_other_value
    one_variable > other_variable
end    

而且可以將它們停用,以便將assertinvariant評估為空語句。 這樣可以避免生產中出現任何性能問題。 但是請注意, 實用程序員建議不要停用它們。 僅當它們確實影響性能時,才應停用它們。

關於回答說慣用的Ruby方式使用的是普通的raise語句,我認為它缺乏表達能力。 斷言編程的黃金法則之一是不使用斷言進行常規異常處理。 它們是完全不同的兩件事。 如果您對兩者使用相同的語法,我認為您的代碼會更加晦澀。 當然,您會失去激活它們的能力。

您可以確信使用斷言是一件好事,因為兩本必讀的經典書籍,例如《從程序員到熟練的實用程序員》《代碼完整》,全書都專門針對它們,並推薦使用它們。 還有一篇名為“ 帶斷言的編程”的好文章,很好地說明了什么是斷言編程以及何時使用它(基於Java,但是概念適用於任何語言)。

您將assert方法添加到內核模塊的原因是什么? 為什么不只使用另一個稱為Assertions模塊呢?

像這樣:

module Assertions
  def assert(param)
    # do something with param
  end

  # define more assertions here
end

如果您確實需要斷言在任何地方都可以使用請執行以下操作:

class Object
  include Assertions
end

免責聲明:我沒有測試代碼,但原則上我會這樣做。

這不是特別習慣,但我認為這是個好主意。 特別是如果這樣做:

def assert(msg=nil)
    if DEBUG
        raise msg || "Assertion failed!" unless yield
    end
end

這樣一來,如果您決定不使用DEBUG(或其他方便的開關,我以前使用過Kernel.do_assert)設置,則不會產生任何影響。

我的理解是,您正在編寫自己的測試套件,以更加熟悉Ruby。 因此,盡管Test :: Unit可能對指導有用,但它可能並不是您想要的(因為它已經完成了工作)。

也就是說,python的assert(至少對我而言)與C的assert(3)更加相似。 它不是專門為單元測試而設計的,而是用來捕獲“絕不應該發生”的情況。

Ruby的內置單元測試如何傾向於看待該問題,那么,每個單獨的測試用例類都是TestCase的子類,並且包含一個“ assert”語句,該語句檢查傳遞給它的內容的有效性並記錄為報告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM