Poltergeist失去了数据库信息

时间:2016-08-22 16:40:47

标签: capybara rspec-rails ruby-on-rails-5 poltergeist

我有一个ActiveRecord类,Post。

在我与Capybara,RSpec和Poltergeist一起运行的功能规范中,我用FactoryGirl创建了它的两个实例

FactoryGirl.create(:post, topic: "Blade running")
FactoryGirl.create(:post, topic: "Dreaming of electric sheep")

我可以在规范中立即验证:

scenario "Linking to post by tag", js: true do
  FactoryGirl.create(:post, topic: "Blade running")
  FactoryGirl.create(:post, topic: "Dreaming of electric sheep")
  Post.count # => 2
  Post.all.all?(&:persisted?) # => true
  visit root_path
  # more stuff
end

但是当我在下一行访问我的应用程序的根路径时(指向我的帖子应用程序中的索引操作),帖子已经消失(及其关联):

class PostsController < ApplicationController
  def index
    @posts = Post.all # => []
    #stuff
  end

# more methods
end

当我从控制器操作回来时,到测试级别,他们又回来了:

Post.count # => 2
Post.all.all?(&:persisted?) # => true
visit root_path
Post.count # => 2
Post.all.all?(&:persisted?) # => true

在不使用JS的规范中我没有这个问题 - 只是从场景中删除“js:true”修复了它。但由于我使用的是需要JS的网站的一部分,这不是一种选择。

我会在Poltergeist问题上发布这个问题,但由于我正在做一些非常基本的事情,我觉得我做错事的可能性远远超过了Poltergeist的这一部分。我的错是什么?

版本: Rails是5.0.0 恶作剧是1.10.0 Capybara是2.8.0 Rspec-Rails是3.5.1

1 个答案:

答案 0 :(得分:2)

听起来您正在使用事务性测试,因为测试和应用程序代码在不同的线程中运行,因此无法使用支持JS的驱动程序。每个线程都维护自己的数据库连接,这意味着在提交事务之前,一个线程无法查看在另一个线程中创建的记录。使用事务测试,事务永远不会被提交,因此线程无法看到在另一个线程中创建的任何内容。请参阅https://github.com/jnicklas/capybara#transactions-and-database-setup,然后配置database_cleaner以使用截断(或删除)策略进行支持JS的测试 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example