在Rspec中使用2个独立的数据库测试库

时间:2018-08-23 08:57:18

标签: ruby-on-rails postgresql sqlite rspec ruby-on-rails-5

我有很多规格的Rails5应用程序,并且由于我的生产/开发也是postgres,所以它们与postgres相对。

我开发了一些位于app / lib中的库,肯定需要规范 这些规范需要一些缩小的模型,也需要一个数据库。由于我不想仅出于规范的目的而在postgres中维护迁移,因此我认为在sqlite3上运行其通用模型是一件好事。

所以来回经过很多时间后,我被卡住了。

我没有典型的spec_helper.rb奇特的东西,所以决定去

sqlite_spec_helper.rb

require './spec/support/reference_app/app'

support/reference_app/app

require 'active_record/railtie'
require 'action_controller/railtie'
require 'responders'
require './spec/support/reference_app/configure_active_record'

class Application < Rails::Application
  config.eager_load = false
  config.secret_key_base = 'supersecret'
end

class ApplicationController < ::ActionController::API
  include Rails.application.routes.url_helpers

  respond_to :json
end

Application.initialize!

require 'rspec/rails'

RSpec.configure do |config|
  config.infer_base_class_for_anonymous_controllers = true
end

spec/support/reference_app/configure_active_record

ENV['RACK_ENV'] = 'test'

ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: ':memory:'
)

ActiveRecord::Schema.define do
  self.verbose = false

  create_table :generic_table do |t|
    t.string :name
    t.string :type
  end
end

因此,我通常的规范顶部有require 'spec_helper,而图书馆规范的顶部是require 'sqlite_spec_helper'。因此,我的想法是,库规范随后将使用之前加载的sqlite连接。

当我运行应该使用sqlite db的测试时,我遇到了

ActiveRecord::StatementInvalid:
       PG::UndefinedTable ...

这意味着它仍然适用于pg连接。有任何有用的提示或信息吗?

1 个答案:

答案 0 :(得分:0)

找到了我最初的问题的解决方案。尽管请记住,更好的方法是将库提取为gem,并按照@Tyrone的建议在其中进行相应的指定。将其放入spec_helper

RSpec.configure do |config|
  config.before(:each, :library) do |example|
    ActiveRecord::Base.establish_connection(
      adapter: 'sqlite3',
      database: ':memory:'
    )

    ActiveRecord::Schema.define do
      self.verbose = false

      create_table :abstract_dummies do |t|
        t.string  :type
        t.text   :meta_data
      end

      create_table :generic_table do |t|
        t.string :name
        t.string :type
      end

      create_table :users do |t|
      end
    end
  end

  config.after(:each, :library) do |example|
    ActiveRecord::Base.establish_connection(:test)
  end
end

:library和您的示例类似,

describe LibraryClass::Foo::Bar, :library do
end

这将在每个示例中使用sqlite3连接,并将其设置回:test中的默认database.yml,这样就不会影响现有的rails堆栈规范。