Enum in Rails单元测试

时间:2013-09-23 13:00:25

标签: mysql sql ruby-on-rails ruby enums

我正在测试一些遗留代码。其中一个表格有一个enum列。 (我知道,不要讨厌。我没有写它。)

在尝试运行单元测试之前,一切正常。突然,数据库架构将enum列保存为varchar(0)。显然不会让我设定任何价值。

这是我的大问题。如何为rake test:units添加挂钩以调整列类型?如果它是enum或仅varchar(100)

,则无关紧要

谢谢!

2 个答案:

答案 0 :(得分:1)

所以这个问题比我预期的更容易解决。在environment.rb文件中有一个部分:

# Use SQL instead of Active Record's schema dumper when creating the test database.
# This is necessary if your schema can't be completely dumped by the schema dumper,
# like if you have constraints or database-specific column types
# config.active_record.schema_format = :sql

取消注释最后一行意味着两件事。首先,模式是用SQL而不是Ruby导出的。其次,保留数据库特定的数据类型。

config.active_record.schema_format = :sql

答案 1 :(得分:0)

好的,我不是建议将其作为所有问题的解决方案,但在这种情况下,你可能会破解自己的rake任务,将列类型更改为字符串,如下所示:

namespace :db do
  desc "Change column type"
    task :test_setup do
      Rake::Task['db:test:prepare'].invoke
      Rails.env = ENV['RAILS_ENV'] = 'test'
      ActiveRecord::Migration.change_table :YOUR_TABLE_NAME do |t|
        t.change :YOUR_ENUM_COLUMN_NAME, :string, :limit => 100
      end
    end
end

此文件将作为whatever_you_want_to_call_it.rake.放在lib / tasks中 然后,您将运行rake db:test:prepare代替rake db:test_setup运行rake db:test:prepare,然后将枚举列更改为varchar(100),我认为这将满足您的需求。如果我错了,请纠正我。

你也应该能够使用Rake::Task['test:units'].invoke来插入你的测试呼叫单元:虽然我没有对此进行测试。

再次黑客这样的事情并不是我一般会推荐的,因为你真的在改变数据类型以及数据库是如何处理的,但是因为这是你所要求的,我想我会尝试帮助。