繁体   English   中英

在单元测试期间连接到2个数据库会导致错误

[英]Connecting to 2 databases during unit testing results in error

我已经启动了一个提交给PostgresSQL数据库的表单,并且已经对我的模型进行了许多测试以验证我的验证。 但是,我创建了一个自定义验证器,用于检查旧版Oracle数据库,以验证旧版数据库中是否存在最终用户以表格形式提供的许可证号。 通过命令行调试器,我可以验证我创建的库是否已连接到数据库并返回结果,并且如果不满足条件,则自定义验证器会导致模型无效。 但是,当我对模型运行单元测试时,运行测试时会发生错误。 如果删除自定义验证,则测试运行通过。

PG::Error: ERROR:  relation "LICENSE" does not exist
      LINE 4:              WHERE a.attrelid = '"LICENSE"'::regclass
                                              ^
      :             SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
                    FROM pg_attribute a LEFT JOIN pg_attrdef d
                      ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                   WHERE a.attrelid = '"LICENSE"'::regclass
                     AND a.attnum > 0 AND NOT a.attisdropped
                   ORDER BY a.attnum

从我的角度来看,似乎测试正在尝试针对在database.yml文件中指定的PostgresSQL数据库而不是在我编写的库中指定的Oracle数据库运行自定义验证。 我不太确定这是原因还是原因,以及如何解决该问题。

这是我的库文件的样子:

module Legacy
  DB_CONFIG = YAML::load(File.open("#{Rails.root}/config/legacy_database.yml"))[Rails.env]

  class Legacy::License < ActiveRecord::Base
    establish_connection DB_CONFIG

    self.table_name = "LICENSE"
    self.primary_key = "LICENSE_ID"
  end
end

这是我的模型:

require "#{Rails.root}/lib/legacy.rb"

class Vehicle < ActiveRecord::Base
  belongs_to :user

  validates_presence_of :permit_license, :name
  validate :validate_license

  def validate_license
    license = Legacy::License.where('license_number = ?', license_number)

    if license.empty?
      errors.add(:license_number, 'License not valid')
    end
  end
end

对于为什么发生这种情况的任何见解都将有所帮助并受到赞赏。

我认为这是配置两个数据库的方式。 我有一个类似的情况,传统数据库与基于Rails ActiveRecord的数据库混合在一起。 (在我的情况下是SQLServer和mysql)

这是我的配置方式。 (仅显示发展情况):

config / database.yml:

aimdevelopment:
  adapter: sqlserver
  .... 

development: 
  adapter: mysql2
  .....

我的旧系统称为AIM

然后,为所有我的旧模型创建一个基础模型:

型号/aim.rb:

class Aim < ActiveRecord::Base
  establish_connection ("aim#{Rails.env}")
end

然后,如果我需要连接到旧数据库中的表

class Product < AIM
  self.table_name 'Product'
  self.primary_key 'ProductID'
end

我认为,当您尝试管理模块中的“ Establishment_connection”时,您已经绕过了rails,这可能是您的不便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM