我通过在Ruby中编码等效于Kent Beck的xUnit来扩展我对Ruby的理解。Python(由Kent编写)以广泛使用的语言提供了assert()方法。Ruby没有。我认为添加它应该很容易,但是Kernel是否正确放置它?
顺便说一句,我知道Ruby中存在各种Unit框架-这是一种学习Ruby习惯用法的练习,而不是“完成某些工作”。
Answers:
不,这不是最佳做法。Ruby中对assert()的最好类比只是在提高
raise "This is wrong" unless expr
如果您想提供更具体的异常处理,则可以实现自己的异常
fail if [expr]
如果愿意,还可以使用引发运行时错误。
fail
是的别名raise
,不是吗?他们俩都给RuntimeError
。(也许是更惯用了吗?)
我认为在Ruby中使用断言是完全有效的。但是您提到的是两件事:
assert
方法来检查您的测试期望。它们旨在在您的测试代码中使用,而不在您的应用程序代码中使用。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
并且可以将它们停用,assert
并invariant
以空语句的形式进行评估。这样可以避免生产中出现任何性能问题。但是请注意,实用程序员建议不要停用它们。仅当它们确实影响性能时,才应停用它们。
关于回答说惯用的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
免责声明:我没有测试代码,但是原则上我会这样做。
Object
班级。
assert
方法在全球范围内可用,那就是这样做的方法。但是,我不建议任何人在非玩具项目中使用这种猴子修补程序。