Capybara-Webkit JS:True RSPEC测试无法与数据库进行交互



我在许多Rails项目上都将RSPEC与Capybara和Capybara-Webkit结合使用,通常运行顺利。由于某种原因,我在这次配置js: true功能规范时遇到问题。他们没有正确与数据库进行交互。我使用factory_girldatabase_cleaner来管理测试数据库内容。database_cleaner.rb中的DatabaseCleaner.strategy = :truncation用于js: true测试,但仍然不起作用。奇怪的是,当我将ActiveRecord::Base.establish_connection放入databse_cleaner.rb中时,测试正常工作。为什么??

这是rails_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if 
Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
Capybara::Webkit.configure(&:block_unknown_urls)
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = false
  config.infer_spec_type_from_file_location!
  # 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")
end

这是spec_helper.rb的重要部分:

ENV['RAILS_ENV'] ||= 'test'
ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup'
Bundler.require
require 'pry-byebug'
require 'capybara/rspec'
require 'capybara/webkit'
require 'database_cleaner'
require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)
# use `describe 'Feature', type: :feature, js: true` to use this driver
Capybara.javascript_driver = :webkit
# tests use regular (faster) driver if they don't require js
Capybara.default_driver = :rack_test
Capybara::Webkit.configure do |config|
  config.allow_unknown_urls
end
RSpec.configure do |config|
  config.after(:suite) do
    FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_files/"])
  end
  config.include Capybara::DSL
...

这是database_cleaner.rb(位于spec/support中(:

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end
  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end
  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end
  config.before(:each) do
    DatabaseCleaner.start
  end
  config.after(:each) do
    DatabaseCleaner.clean
  end
end

当我更改此操作时,测试可以正确与DB进行交互:

config.before(:each, js: true) do
  ActiveRecord::Base.establish_connection
  DatabaseCleaner.strategy = :truncation
end

为什么?我不必明确告诉它建立数据库连接。

您的问题指出您正在使用的问题:JS测试的事务,但代码显示:截断。截断是您在JS测试中应该使用的,所以我认为问题是错字。

您应该使用推荐的database_cleaner-https://github.com/databasecleaner/database_cleaner#rspec-with-capybara-example-检测是否基于使用驱动程序而不是使用drunce'元数据,还使用append_after,而不仅仅是after,这对于测试稳定性非常重要。

我也不会在您的rails_helper或spec_helper

中看到require 'capybara/rails'

设置js: true时,您本质上只是使用Capybara,这本质上是Selenium驱动的浏览器请求。在测试过程之外运行的任何代码(如此Selenium浏览器请求(都不会看到数据库固定装置。

优于您所做的事情,是在Selenium Web服务器上共享数据状态并测试代码本身。

rspec.config(可能是您的database_cleaner.rb(中的某个地方,您需要设置

config.use_transactional_fixtures = false

"使用RSPEC进行的每日轨道测试"具有某些测试场景所需的技巧,在某些测试方案中,您需要在Rails 5之前共享相同的DB连接。尽管它可能会引起其他问题,如以下评论:

制作 spec/support/shared_db_connection.rb 文件并添加此内容:

class ActiveRecord::Base 
  mattr_accessor :shared_connection 
  @@shared_connection = nil
  def self.connection
    @@shared_connection || retrieve_connection
  end 
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

最新更新