加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 自定义事务不适用于rspec中的database_cleaner

发布时间:2020-12-17 04:18:13 所属栏目:百科 来源:网络整理
导读:在使用 MySql的Rails 4.0应用程序中,我们将rspec与使用strategy:transaction配置的database_cleaner gem一起使用,以清理每个测试用例的数据库.如果我们有自定义事务,应该回滚,它不起作用. 没有database_cleaner gem并且只使用标准方式: config.use_transac
在使用 MySql的Rails 4.0应用程序中,我们将rspec与使用strategy:transaction配置的database_cleaner gem一起使用,以清理每个测试用例的数据库.如果我们有自定义事务,应该回滚,它不起作用.

没有database_cleaner gem并且只使用标准方式:

config.use_transactional_fixtures = true

一切都按预期工作.但是对于使用JavaScript运行功能测试,我们需要database_cleaner将夹具删除策略更改为:截断.

我们如何将database_cleaner与自定义事务一起使用,为什么它与标准的rspec事务策略不同?

解决方法

问题是database_cleaner在测试结束时调用ActiveRecord.rollback – 您也在代码中使用它. InnoDB / MySQL不支持真正的嵌套事务,因此代码中的嵌套事务不会被真正视为事务,除非明确调用它们.

考虑这个块(来自ActiveRecord文档):

User.transaction do
  User.create(username: 'Kotori')
  User.transaction do
    User.create(username: 'Nemu')
    raise ActiveRecord::Rollback
  end
end

在回滚呼叫之后你期望发生什么?你希望它能够回滚Nemu用户,然后让你知道Kotori,对吧?嗯,实际发生的是Kotori和Nemu都是创造出来的.回滚不会触发,因为您处于嵌套事务中(并且AR当前只关心父事务)并且父事务(具有实际的db事务)没有看到回滚调用 – 因为它在孤立的街区.有点奇怪.

解:

Klass.transaction(requires_new: true)

如果设置requires_new,ActiveRecord将使用或伪使用嵌套事务(对于Postgres,它将进行嵌套事务,对于MySQL / InnoDB,它将创建保存点).当您使用ActiveRecord调用回滚时,它将确定其范围并发出正确的回滚.

另一种解决方案是使用截断或删除作为涉及事务的测试的策略.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读