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