我被编码Kent Beck的在Ruby中的xUnit的等效扩大我的Ruby的理解。 蟒(其在肯特写入)具有其中被广泛使用的语言的断言()方法。 Ruby没有。 我觉得应该是很容易添加这但是内核把它放在正确的地方?
顺便说一句, 我知道在Ruby中的各种单元框架的存在 -这是学习Ruby的成语,而不是“得到的东西做”的练习。
我被编码Kent Beck的在Ruby中的xUnit的等效扩大我的Ruby的理解。 蟒(其在肯特写入)具有其中被广泛使用的语言的断言()方法。 Ruby没有。 我觉得应该是很容易添加这但是内核把它放在正确的地方?
顺便说一句, 我知道在Ruby中的各种单元框架的存在 -这是学习Ruby的成语,而不是“得到的东西做”的练习。
不,这不是一个最佳实践。 最好的比喻断言()在Ruby中只是提高
raise "This is wrong" unless expr
并且可以实现自己的异常,如果你想提供更具体的异常处理
我认为这是完全有效使用断言在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编写的,但概念适用于任何语言)。
什么是你的理由添加断言方法内核模块? 为什么不直接使用其他模块调用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
如果你决定不与调试运行这样的话有没有影响(或者其他方便的开关,我用Kernel.do_assert过去)集。
我的理解是,你写你自己的测试套件为越来越熟悉Ruby的一种方式。 因此,尽管测试::单位可能是有用的指导,这可能不是你要找的是什么(因为它已经完成任务)。
这就是说,蟒蛇的断言是(对我来说,至少),更类似于C中的断言(3) 。 这不是专门为单元测试设计,而搭上情况下,“这种情况不应该发生”。
Ruby的内置单元测试如何倾向于把问题的话,是每一个人的测试用例类是一个子类TestCase的 ,并且包括一个“断言”,检查一下传递给它的有效性和记录它的声明报告。