我有很多规格的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连接。有任何有用的提示或信息吗?
答案 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堆栈规范。