首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么即使在use_transactional_fixtures = false的情况下after_commit也不能运行

为什么即使在use_transactional_fixtures = false的情况下after_commit也不能运行
EN

Stack Overflow用户
提问于 2012-05-19 01:12:22
回答 5查看 6.9K关注 0票数 15

rspec中的事务性fixture阻止after_commit被调用,但即使我用

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end

after_commit callback不运行。

这是一个包含最新rspec / rails的rails应用程序,我在上面生成了这个问题:git://github.com/sheabarton/after_commit_demo.git

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-04 11:08:05

一种解决方法是手动触发commit回调。示例:

describe SomeModel do
  subject { ... }

  context 'after_commit' do
    after { subject.run_callbacks(:commit) }

    it 'does something' do
      subject.should_receive(:some_message)
    end
  end
end

有点晚了,但希望这能对其他人有所帮助。

票数 28
EN

Stack Overflow用户

发布于 2014-05-22 19:59:21

在我的例子中,我用下面的database_cleaner设置解决了这样的问题:

config.use_transactional_fixtures = false

config.before(:suite) do
  DatabaseCleaner.strategy = :deletion
  DatabaseCleaner.clean_with(:truncation)
end

config.before(:each) do
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner.clean
end

感谢Testing after_commit/after_transaction with Rspec

票数 9
EN

Stack Overflow用户

发布于 2014-11-11 01:24:43

这类似于@jamesdevar上面的答案,但是我不能添加代码块,所以我必须创建一个单独的条目。

你不需要改变整个规范套件的策略。您可以在全局范围内继续使用:transaction,然后根据需要只使用:deletion:truncation (它们都可以工作)。只需在相关规范中添加一个标志即可。

config.use_transactional_fixtures = false

config.before(:suite) do
  # The :transaction strategy prevents :after_commit hooks from running
  DatabaseCleaner.strategy = :transaction
  DatabaseCleaner.clean_with(:truncation)
end

config.before(:each, :with_after_commit => true) do
  DatabaseCleaner.strategy = :truncation
end

然后,在你的规格中:

describe "some test requiring after_commit hooks", :with_after_commit => true do
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10656942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档