测试数据库不会使用在特性测试中创建的固定装置
Test database wont use fixtures created inside feature tests
我将 selenium webdriver 添加到我的测试设置中,开始编写一些基于 javascript 的测试。我加了
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :selenium_chrome
Capybara.configure do |config|
config.default_max_wait_time = 5
config.default_driver = :selenium
end
我的 rails 助手现在看起来像这样
rails_helper.rb
require "spec_helper"
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../config/environment", __dir__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require "rspec/rails"
require "capybara/rspec"
Dir[Rails.root.join("spec", "support", "**", "*.rb")].each { |f| require f }
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
RSpec.configure do |config|
config.infer_spec_type_from_file_location!
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :selenium_chrome
Capybara.configure do |config|
config.default_max_wait_time = 5
config.default_driver = :selenium
end
# Filter lines from Rails gems in backtraces.
config.filter_rails_from_backtrace!
# arbitrary gems may also be filtered via:
# config.filter_gems_from_backtrace("gem name")
# Include Factory Bot syntax methods
config.include FactoryBot::Syntax::Methods
# Configure Database Cleaner
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
end
进行这些更改后,我之前的功能测试失败了,因为现在它们不使用在测试中创建的固定装置。
即features/article_spec.rb
require "rails_helper"
RSpec.describe "articles", type: :feature do
before :each do
create(:article, published: false)
create(
:article,
name: "Published article",
body_text: "Lorem ipsum",
published_at: Time.now,
published: true
)
end
describe "article feature" do
it "shows only published articles" do
visit("/articles")
expect(page).to have_css(".article-container", count: 1)
end
end
end
测试不是 运行 无头的,所以我可以跟进并看到尽管在 article_spec.rb 中创建,但没有文章存在。我假设驱动程序使用另一台服务器 and/or 另一个数据库执行测试,但我不确定。在这种情况下,不知道如何更改它或如何为该数据库播种。你们有什么线索吗?
您不能将 around
挂钩用于 RSpec 和 Capybara 的数据库清理器,因为挂钩进入 运行 的顺序。如果您要继续使用您需要使用更接近推荐配置的数据库清理器 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example
话虽这么说,因为 Rails 5.1 假设您使用的是正常配置(使用本地应用程序进行测试,正常的数据库配置,最新的 rspec-rails,等等) 你根本不需要使用数据库清理器,只需在你的 RSpec 配置中设置 config.use_transactional_fixtures = true
,删除所有对数据库清理器的引用,数据库连接应该在你的测试和应用程序之间安全共享正在测试中。
我将 selenium webdriver 添加到我的测试设置中,开始编写一些基于 javascript 的测试。我加了
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :selenium_chrome
Capybara.configure do |config|
config.default_max_wait_time = 5
config.default_driver = :selenium
end
我的 rails 助手现在看起来像这样
rails_helper.rb
require "spec_helper"
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../config/environment", __dir__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require "rspec/rails"
require "capybara/rspec"
Dir[Rails.root.join("spec", "support", "**", "*.rb")].each { |f| require f }
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
RSpec.configure do |config|
config.infer_spec_type_from_file_location!
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :selenium_chrome
Capybara.configure do |config|
config.default_max_wait_time = 5
config.default_driver = :selenium
end
# Filter lines from Rails gems in backtraces.
config.filter_rails_from_backtrace!
# arbitrary gems may also be filtered via:
# config.filter_gems_from_backtrace("gem name")
# Include Factory Bot syntax methods
config.include FactoryBot::Syntax::Methods
# Configure Database Cleaner
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
end
进行这些更改后,我之前的功能测试失败了,因为现在它们不使用在测试中创建的固定装置。
即features/article_spec.rb
require "rails_helper"
RSpec.describe "articles", type: :feature do
before :each do
create(:article, published: false)
create(
:article,
name: "Published article",
body_text: "Lorem ipsum",
published_at: Time.now,
published: true
)
end
describe "article feature" do
it "shows only published articles" do
visit("/articles")
expect(page).to have_css(".article-container", count: 1)
end
end
end
测试不是 运行 无头的,所以我可以跟进并看到尽管在 article_spec.rb 中创建,但没有文章存在。我假设驱动程序使用另一台服务器 and/or 另一个数据库执行测试,但我不确定。在这种情况下,不知道如何更改它或如何为该数据库播种。你们有什么线索吗?
您不能将 around
挂钩用于 RSpec 和 Capybara 的数据库清理器,因为挂钩进入 运行 的顺序。如果您要继续使用您需要使用更接近推荐配置的数据库清理器 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example
话虽这么说,因为 Rails 5.1 假设您使用的是正常配置(使用本地应用程序进行测试,正常的数据库配置,最新的 rspec-rails,等等) 你根本不需要使用数据库清理器,只需在你的 RSpec 配置中设置 config.use_transactional_fixtures = true
,删除所有对数据库清理器的引用,数据库连接应该在你的测试和应用程序之间安全共享正在测试中。