在Rails测试中,有没有一种方法可以在不引发异常的情况下回滚ActiveRecord事务



我正在编写测试,并且为必须引发异常才能进行回滚这一事实而烦恼。

raise ActiveRecord::Rollback

我之所以对此感到困扰,是因为我需要回滚,以便在下一次测试运行时保持数据库干净。没有什么特殊事件。

这与不应期望出现例外的想法背道而驰。除此之外,例外情况代价高昂。

那么,是否有其他方法可以回滚,或者我的担忧是否不合理(如果是,请解释原因)?

我忘了提我的应用程序是一个使用ActiveRecord和迷你测试的Sinatra应用程序。

一般来说,我认为您的担忧是合理的。在大多数情况下,的例外情况成本很高,不应被期望。

但是,根据ActiveRecord::Rollback的文档,这个异常有些独特。它旨在"将故意回滚与其他特殊情况区分开来"。

引用文件:

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

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

话虽如此,正如Sergio和Dan在评论中指出的那样,许多人似乎更喜欢Rails的事务固定装置或数据库清理器之类的简单性,而不是创建自定义解决方案。

相关内容

  • 没有找到相关文章

最新更新