测试数据库不会使用在特性测试中创建的固定装置

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,删除所有对数据库清理器的引用,数据库连接应该在你的测试和应用程序之间安全共享正在测试中。