我正在编写测试,并且因为我必须提出异常才能获得回滚而感到困扰。
raise ActiveRecord::Rollback
我之所以感到困扰,是因为我需要回滚以保持数据库清洁以进行下一次测试运行。没有例外事件。
这违背了不应该预期的例外的想法。除此之外,例外是昂贵的。
那么,还有其他方法可以回滚或者我的问题是否合理(如果是这样,请解释原因)?
我忘了提及我的应用程序是使用ActiveRecord和mini测试的Sinatra应用程序。
答案 0 :(得分:1)
我认为你的担忧一般都是合理的。在大多数情况下,的例外费用很高,而且不应该是预期的。
但是,根据documentation for ActiveRecord::Rollback,这个例外有点独特。它旨在“将故意回滚与其他特殊情况区分开来”。
引用文档:
ActiveRecord :: Transactions :: ClassMethods #event使用此异常来区分故意回滚与其他异常情况。通常,引发异常将导致事务方法回滚数据库事务并传递异常。但是如果你引发了一个ActiveRecord :: Rollback异常,那么数据库事务将被回滚,而不会传递异常。
如果Rails以这种方式专门使用它,那么就没有理由不将它用于此(或任何其他相关)目的。
有了这个说法,很多人似乎更喜欢Rails' transactional fixtures或database cleaner之类的简单性用于你的用例,正如Sergio和Dan在评论中指出的那样,而不是创建一个习惯溶液