使用Rails'活动记录,还有另一种方法可以在不引发异常的情况下获得回滚吗?

时间:2015-11-05 07:08:18

标签: ruby-on-rails ruby activerecord

我正在编写测试,并且因为我必须提出异常才能获得回滚而感到困扰。

raise ActiveRecord::Rollback

我之所以感到困扰,是因为我需要回滚以保持数据库清洁以进行下一次测试运行。没有例外事件。

这违背了不应该预期的例外的想法。除此之外,例外是昂贵的。

那么,还有其他方法可以回滚或者我的问题是否合理(如果是这样,请解释原因)?

我忘了提及我的应用程序是使用ActiveRecord和mini测试的Sinatra应用程序。

1 个答案:

答案 0 :(得分:1)

我认为你的担忧一般都是合理的。在大多数情况下,的例外费用很高,而且不应该是预期的。

但是,根据documentation for ActiveRecord::Rollback,这个例外有点独特。它旨在“将故意回滚与其他特殊情况区分开来”。

引用文档:

  

ActiveRecord :: Transactions :: ClassMethods #event使用此异常来区分故意回滚与其他异常情况。通常,引发异常将导致事务方法回滚数据库事务并传递异常。但是如果你引发了一个ActiveRecord :: Rollback异常,那么数据库事务将被回滚,而不会传递异常。

如果Rails以这种方式专门使用它,那么就没有理由不将它用于此(或任何其他相关)目的。

有了这个说法,很多人似乎更喜欢Rails' transactional fixturesdatabase cleaner之类的简单性用于你的用例,正如Sergio和Dan在评论中指出的那样,而不是创建一个习惯溶液