0

rspec テストを実行するためにメモリ sqlite データベースを使用しています。これは非常にうまく機能します。セレン駆動テスト ( describe "does something", :js => true do) を実行している場合にのみ、起動中の Web ブラウザーでエラーが発生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 します。メモリ内データベースを使用しているときに、セレン駆動テストを実行するためのソリューションを探しています。

詳細:

ruby on rails 4.0と以下のgemを使っています(抜粋)

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

この問題は、カピバラ Web サーバーが (テスト自体で使用される接続とは対照的に) 独自のデータベース接続を使用することと関係があるようですが、メモリ内データベースはそれを作成した 1 つの接続でしか利用できません。

この質問はすでにいくつかの洞察を提供しました: (DatabaseError: no such table: django_session) ERROR during Django 1.3 selenium testing

では、どうすればセレンテストをメモリデータベース互換にすることができますか?

事前にどうもありがとうございました。

4

1 に答える 1

1

カピバラのReadme自体はActiveRecord::Basespec_helper.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

spork を使用する場合、最後の行はセクションに属しSpork.each_runます。この場合、schema.rbinもロードする必要がありますSpork.each_run

これは実際に機能しますが、注意して使用することをお勧めします。詳細については、Rspec + Selenium に共有 ActiveRecord 接続を使用しない理由を参照してください。

于 2013-10-22T08:21:41.690 に答える