我正在使用内存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测试内存数据库兼容?
非常感谢你。
答案 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?