我有一个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.0Poltergeist是1.10.0Capybara 2.8.0版本
听起来你正在使用事务性测试,它不能与JS驱动程序一起工作,因为测试和应用程序代码在不同的线程中运行。这些线程中的每一个都维护自己的数据库连接,这意味着在事务提交之前,一个线程无法看到在另一个线程中创建的记录。使用事务性测试时,事务永远不会提交,因此线程无法看到在其他线程中创建的任何内容。请参阅https://github.com/jnicklas/capybara#transactions-and-database-setup,然后配置database_cleaner以对支持JS的测试使用截断(或删除)策略- https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example