3

我在 Rails 4.2.6 中有一个 Web 应用程序,它最初使用 MongoDB(通过 Mongoid 5)作为其主数据库。但是,现在我需要连接到 MySQL 数据库才能仅为我的应用程序读取一些额外的数据。

到目前为止,我的项目中已经需要 ActiveRecord,并且能够在开发环境中与上述数据库建立连接。我的配置文件是:

mongoid.yml

development:
  clients:
    default:
      database: mongo_development
      hosts:
        - localhost:27017
      options:
test:
  clients:
    default:
      database: mongo_test
      hosts:
        - localhost:27017
      options:
        read:
          mode: :primary
        max_pool_size: 1
  options:
    raise_not_found_error: false

数据库.yml

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: mysql_development
  pool: 5
  username: user
  password: pass
  socket: /var/run/mysqld/mysqld.sock

当我运行我的测试套件时,问题就来了。我正在使用 RSpec 并执行bundle exec rspec spec会产生以下错误消息:

 /home/user/.rvm/gems/ruby-2.1.6@global/gems/activerecord-4.2.6/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_connection': 'test' database is not configured. Available: ["development"] (ActiveRecord::AdapterNotSpecified)

ActiveRecord 抱怨没有要连接的测试数据库,但问题是我没有用于测试目的的 MySQL 数据库:我编写的规范仅与 Mongoid 模型交互。

我正在考虑创建一个空的 MySQL 数据库作为 hack,但我想首先知道是否可以将 ActiveRecord 配置为不连接到测试数据库并仅使用mongo_test.

有可能做我想做的事吗?有人知道怎么做这个吗?

4

2 回答 2

1

这里有两种解决方法

要么:为您的测试环境添加一个 sqlite 数据库。

test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

或者:将您的自动加载从application.rb特定于环境的配置中移动,并将activerecordgem移动developmentGemfile.

宝石文件

group :development do
  gem 'activerecord'
end

配置/应用程序.rb

  • 第一:将其移至config/environments/test.rband config/environments/development.rb(记住要从环境中排除的模型test,即activerecordmo

    config.autoload_paths += WHATEVER
    

删除require 'rails/all'行并要求您也想在每个环境文件中专门使用的框架。

于 2016-06-01T09:39:55.190 回答
1

我决定回答我自己的问题,因为提供的答案不符合我的需要。

经过多次试验和错误后,我能够避免在测试环境中连接到 MySQL 数据库,以适应此问题帖子中给出的信息。

我唯一需要做的就是将以下 gem 添加到我的Gemfile 中

group :test do
  gem 'activerecord-nulldb-adapter'
end

这个gem在项目中安装了NullDB数据库适配器,使得ActiveRecord无需定义真实数据库就可以建立连接。

最后但同样重要的是,我更新了我的config/database.yml ,在使用新适配器的测试环境中添加了数据库连接的参数:

test:
  adapter: nulldb
  encoding: utf8
  reconnect: false
  database: mysql_test
  pool: 5
  username: user
  password: pass
  socket: /var/run/mysqld/mysqld.sock
于 2016-06-02T10:34:58.457 回答