Rails 4:使用sqlite内存数据库进行硒驱动测试

时间:2013-10-21 11:20:24

标签: ruby-on-rails sqlite selenium

我正在使用内存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 我正在寻找一种在使用内存数据库时运行selenium驱动测试的解决方案。

详细信息:

我在rails 4.0和以下宝石上使用ruby(摘录)

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

的database.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

问题似乎有些事情要做,因为水豚Web服务器使用自己的数据库连接(而不是测试本身使用的连接),但内存数据库仅适用于创建它的一个连接。

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

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

非常感谢你。

1 个答案:

答案 0 :(得分:1)

capybara Readme本身建议对ActiveRecord::Base

中的spec_helper.rb进行monkeypatch
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部分。 在这种情况下,您还必须在schema.rb中加载Spork.each_run

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