Ruby on rails 在Rspec中使用2个单独的数据库测试库

Ruby on rails 在Rspec中使用2个单独的数据库测试库,ruby-on-rails,postgresql,sqlite,rspec,ruby-on-rails-5,Ruby On Rails,Postgresql,Sqlite,Rspec,Ruby On Rails 5,我有很多规格的Rails5应用程序,这些都是针对postgres运行的,因为我的产品/开发也是postgres 我开发了一些库,放在app/lib中,肯定需要规范 这些规范需要一些缩小的模型,这些模型也需要一个数据库。因为我不想在我的postgres中只为规范维护迁移,所以我认为在sqlite3上运行这些迁移很好,因为它是通用模型 因此,经过大量的来回,我被卡住了 我有一个典型的spec\u helper.rbnothing spectecular,我决定选择它 sqlite\u spec\u

我有很多规格的Rails5应用程序,这些都是针对postgres运行的,因为我的产品/开发也是postgres

我开发了一些库,放在app/lib中,肯定需要规范 这些规范需要一些缩小的模型,这些模型也需要一个数据库。因为我不想在我的postgres中只为规范维护迁移,所以我认为在sqlite3上运行这些迁移很好,因为它是通用模型

因此,经过大量的来回,我被卡住了

我有一个典型的
spec\u helper.rb
nothing spectecular,我决定选择它

sqlite\u spec\u helper.rb
support/reference\u app/app
因此,我通常的规范顶部有
require'spec\u helper
,而库规范顶部有
require'sqlite\u spec\u helper'
。因此,我的想法是,libary规范使用之前加载的sqlite连接

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

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

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

找到了我最初问题的答案。尽管请记住,更好的方法是将库提取到gem中,并按照@Tyrone的建议相应地对其进行规范。将其放入
spec\u 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
:库
到您的示例

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

然后,这将为每个示例使用sqlite3连接,并将其设置回
数据库.yml中的默认
:test
,这样不会影响exsting rails堆栈规范

您的
.rspec
文件中有什么?这是一种配置规范运行前发生的情况的方法。在执行
Application.initialize之后,可以调用
require./spec/support/reference\u app/configure\u active\u record'
也许它正在用config/database.yml info@DickieBoy
覆盖ActiveRecord配置。rspec
文件只需使用-
-color
选项,以避免将spec\u助手加载到每个测试中@泰龙·威尔逊:好消息。这至少让我更近了一步。如果我运行我的两个规范,一个是libary,另一个是postgres堆栈,它们各自都可以正常工作。但是当我运行整个rspec套件时,它失败了,因为它似乎都是针对sqlite数据库运行的。他们显然失败了。所以我猜rspec很想加载所有内容,最终其中一个dbs是最后定义的,并覆盖了另一个。@daniel,除了想知道为什么需要这样做之外,我个人只想通过克隆environments/test.rb创建另一个环境,并使其成为libtest或其他东西。但是,如果不了解全部情况,就很难对你的最佳前进道路发表评论。我怀疑运行单独的测试是不必要的。如果你想运行一个或另一个,那么只需标记它们并使用过滤器运行。在这种情况下,听起来你应该创建一个gem。听起来你的模特“太胖了”。i、 e.您应该只为数据库相关的东西使用模型,然后组合其他功能,您可以单独测试。这是我对这个问题的看法,它通常对我很有帮助。
ActiveRecord::StatementInvalid:
       PG::UndefinedTable ...
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
describe LibraryClass::Foo::Bar, :library do
end