【问题标题】:Test database wont use fixtures created inside feature tests测试数据库不会使用在特性测试中创建的夹具
【发布时间】:2020-07-20 11:12:25
【问题描述】:

我将 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 中创建,但没有文章存在。我假设驱动程序使用另一台服务器和/或另一个数据库执行测试,但我不确定。在这种情况下,不知道如何更改或如何为该数据库播种。你们有什么线索吗?

【问题讨论】:

  • 你使用的是什么版本的 Rails?
  • @ThomasWalpole 我正在使用 rails 5.2.1 和 ruby​​ 2.5.1

标签: ruby-on-rails selenium selenium-webdriver rspec capybara


【解决方案1】:

由于钩子的运行顺序,您不能将 around 钩子用于 RSpec 和 Capybara 的数据库清理器。如果您要继续使用数据库清理器,则需要使用更接近推荐的配置- https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example

话虽如此,自从 Rails 5.1 假设您使用的是普通配置(使用本地应用程序、普通数据库配置、最新的 rspec-rails 等进行测试)以来,您根本不需要使用数据库清理器,只需在您的 RSpec 配置中设置 config.use_transactional_fixtures = true,删除对数据库清理器的所有引用,并且应该在您的测试和被测应用之间安全地共享数据库连接。

【讨论】:

  • 你太好了!在您通过链接提供的示例之后更改了数据库清理器设置,它就像一个魅力:)
  • 鉴于我用于功能测试的驱动程序设置,您知道开始无头运行测试的最简单方法吗?
  • @JonasFagerlund 在驱动程序注册中指定使 Chrome 无头的选项 - 有关示例,请参见 github.com/teamcapybara/capybara/blob/master/lib/capybara/…
猜你喜欢
  • 2022-06-17
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多