在Ruby生产中使用断言...是或否?

时间:2011-04-07 19:35:40

标签: ruby software-design

所以,这是交易。我目前正在使用Ruby on Rails环境,并且已经使用了大约1年。在此之前,我在C ++ / Java领域已有近十年的历史。我(仍然)试图找出断言时Ruby的方式。

我并不担心技术细节。我知道TestUnit有断言可以在测试环境中使用,我知道我可以将自己的断言方法添加到我的Ruby项目中,并在生产Rails中使用它们来锁定已知条件。问题是:在我知道应该/不会发生的代码中确保某些内容的Ruby方法是什么?

为了记录,我一直在测试和提高生产中断言。我仍然忍不住想念我的作品......

谢谢! - =艾哈迈德= -

3 个答案:

答案 0 :(得分:4)

由于两个原因,断言确实不应该在生产代码中使用。

  1. assert x非常实用,因此难以阅读。使用raise / if组合可以增加可读性。

  2. 断言不清楚如果条件失败将引发什么错误。同时,

    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方法不可用)。

     

请注意,此示例也使用模糊数匹配,但是   断言本身不需要。