Poltergeist 丢失数据库信息

Poltergeist losing db info

我有一个 ActiveRecord class, 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

但是当我在下一行访问我的应用程序的根路径时(它指向我的 posts 应用程序中的索引操作),Posts 已经消失(连同他们的协会):

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 的网站的一部分,所以这不是一个选项。

我会 post 在 Poltergeist 问题上这样做,但是由于我正在做一些非常基础的事情,所以感觉我做错事的可能性比 Poltergeist 的这一部分被破坏的可能性要大得多。我的错误是什么?

版本: Rails 是 5.0.0 闹鬼是 1.10.0 水豚是2.8.0 Rspec-Rails 是 3.5.1

听起来您使用的事务测试不适用于支持 JS 的驱动程序,因为测试代码和应用程​​序代码 运行 在不同的线程中。这些线程中的每一个都维护自己的数据库连接,这意味着在提交事务之前,一个线程无法看到另一个线程中创建的记录。通过事务测试,事务永远不会提交,因此线程看不到在另一个线程中创建的任何内容。参见 https://github.com/jnicklas/capybara#transactions-and-database-setup and then configure database_cleaner to use truncation (or deletion) strategy for your JS capable tests - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example