ruby-on-rails - 如何测试某个函数是否使用 Rails 和 rspec 2 中的事务

标签 ruby-on-rails ruby rspec transactions rails-activerecord

我有一个模型函数,我想确保它使用事务。例如:

class Model 
  def method
    Model.transaction do
      # do stuff
    end
  end
end

我目前的方法是在 block 内存入一个方法调用以引发 ActiveRecord::Rollback 异常,然后检查数据库是否真的发生了变化。但这意味着如果由于某种原因 block 内的实现发生变化,那么测试就会中断。

你会如何测试这个?

最佳答案

你应该换个角度看问题。 从行为的角度来看,测试函数是否使用事务是没有用的。它不会为您提供有关函数是否按预期运行的任何信息。

您应该测试的是行为,即预期结果是否正确。为清楚起见,假设您在函数内执行操作 A 和操作 B(在一个事务内执行)。操作 A 在您的应用中向用户记入 100 美元。操作 B 从用户信用卡中扣除 100 美元。

您现在应该为测试提供无效的输入信息,以便从用户的信用卡中扣款失败。将整个函数调用包装在 expect { ... }.not_to change(User, :balance) 中。

通过这种方式,您可以测试预期的行为 - 如果信用卡借记失败,则不要将金额记入用户。此外,如果您只是重构您的代码(例如,您停止使用事务并手动回滚),那么您的测试用例的结果应该不会受到影响。

话虽如此,您仍然应该像@luacassus 提到的那样单独测试这两个操作。此外,如 @rb512 所述,如果您对源代码进行“不兼容”更改(即更改行为),那么您的测试用例应该失败是完全正确的。

关于ruby-on-rails - 如何测试某个函数是否使用 Rails 和 rspec 2 中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10511236/

相关文章:

ruby - 电报机器人在特定时间用 ruby 发送消息

ruby - 为什么 Ruby 中的迭代需要这么长时间?

ruby-on-rails - ActionController::UrlGenerationError:没有自定义路由的路由匹配

ruby-on-rails - ActiveAdmin 中仅自定义一个字段

mysql - Rails 迁移需要不可移植的 SQL

ruby-on-rails - 如何在 HAML 中使用 if 语句来控制标记类字符串?

ruby - 当类从 Hash 继承时,从初始化方法中获取类名

ruby-on-rails - Rspec 测试 'cancan' 。未初始化的常量能力(NameError)

ruby-on-rails - 为什么 FactoryGirl( :build) work with Sorcery, 而不是 FactoryGirl( :create)?

ruby-on-rails - 需要将 wrapbootstrap 主题集成到新的 Rails 应用程序中的说明