所以,这是交易。我目前正在使用Ruby on Rails环境,并且已经使用了大约1年。在此之前,我在C ++ / Java领域已有近十年的历史。我(仍然)试图找出断言时Ruby的方式。
我并不担心技术细节。我知道TestUnit有断言可以在测试环境中使用,我知道我可以将自己的断言方法添加到我的Ruby项目中,并在生产Rails中使用它们来锁定已知条件。问题是:在我知道应该/不会发生的代码中确保某些内容的Ruby方法是什么?
为了记录,我一直在测试和提高生产中断言。我仍然忍不住想念我的作品......
谢谢! - =艾哈迈德= -
答案 0 :(得分:4)
由于两个原因,断言确实不应该在生产代码中使用。
assert x
非常实用,因此难以阅读。使用raise / if组合可以增加可读性。
断言不清楚如果条件失败将引发什么错误。同时,
raise ObscureButInformitiveError if condition
让应用程序层进一步做一些重要的事情。例如通过电子邮件发送管理员或写入特定日志。
答案 1 :(得分:1)
让错误发生,然后检查日志是否出错,然后修复它 Rails会自动捕获所有未捕获的异常,它只会搞乱发生错误的单个请求。
答案 2 :(得分:0)
Ruby中没有正式的非测试断言,但有宝石。
例如Jim Weirich的Given看起来很有希望。虽然它的主要焦点是测试环境(rspec / minitest),但它也是:
...提供了三个用于表示的断言 非测试/非规范代码。例如,这是一个平方根函数 装备前后条件断言。
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
模块包含在所有内容中 class正在使用Precondition
/Postcondition
/Assert
方法。代码 这些断言的块应该始终是常规的Ruby true / false 值(来自RSpec的should和expect方法不可用)。请注意,此示例也使用模糊数匹配,但是 断言本身不需要。