【问题标题】:Rails 4: Use sqlite memory db for selenium driven testsRails 4:使用 sqlite 内存数据库进行硒驱动测试
【发布时间】:2013-10-29 20:44:48
【问题描述】:

我正在使用内存 sqlite 数据库来运行 rspec 测试。这功能非常好。只有在运行 selenium 驱动的测试 (describe "does something", :js => true do) 时,启动 webbrowser 才会收到错误 SQLite3::SQLException: no such table: users: SELECT "users".* FROM "users" WHERE ... WEBrick/1.3.1 (Ruby/2.0.0/2013-02-24) at 127.0.0.1:57827 我正在寻找一种在使用内存数据库时运行硒驱动测试的解决方案。

详情:

我在 Rails 4.0 和以下 gems 上使用 ruby​​(摘录)

gem 'sqlite3', '1.3.7'
gem 'rspec-rails', '2.13.0'
gem 'capybara', '~> 2.1.0.beta1'
gem 'selenium-webdriver', '2.35.1'

数据库.yml

test:
    adapter: sqlite3
    database: ":memory:" 
    pool: 5
    timeout: 5000

spec_helper.rb

require 'rubygems'
require 'spork'
Spork.prefork do
     # snip
    load "#{Rails.root.to_s}/db/schema.rb"  # set up memory db
    RSpec.configure do |config|
    config.use_transactional_fixtures = false #using database cleaner
    #snip
    config.before :suite do
      DatabaseCleaner.strategy = :transaction
      DatabaseCleaner.clean_with(:truncation)
    end

    config.before type: :request do
       DatabaseCleaner.strategy = :truncation
    end

    # Reset so other non-request specs don't have to deal with slow truncation.
    config.after type: :request do
       DatabaseCleaner.strategy = :transaction
    end
    config.before(:each, :js => true) do
       DatabaseCleaner.strategy = :truncation
    end
    config.before do
       DatabaseCleaner.start
       ActionMailer::Base.deliveries.clear
    end

    config.after do
      DatabaseCleaner.clean
    end
  end  
end

问题似乎与 capybara web 服务器使用自己的数据库连接(与测试本身使用的连接相反)有关,但内存数据库仅可用于创建它的一个连接。

这个问题已经提供了一些见解: (DatabaseError: no such table: django_session) ERROR during Django 1.3 selenium testing

那么,我怎样才能使 selenium 测试内存数据库兼容?

非常感谢您。

【问题讨论】:

    标签: ruby-on-rails sqlite selenium


    【解决方案1】:

    capybara Readme 本身建议对spec_helper.rb 中的ActiveRecord::Base 进行猴子补丁

    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
    

    如果您使用 spork,则最后一行属于 Spork.each_run 部分。 在这种情况下,您还必须在Spork.each_run 中加载schema.rb

    这确实有效,但建议谨慎使用。 更多信息见Why not use shared ActiveRecord connections for Rspec + Selenium?

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多