0

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

在尝试运行单元测试之前一切正常。突然,数据库模式将enum列保存为varchar(0). 显然不允许我设置任何值。

这是我的大问题。如何添加一个钩子来rake test:units调整列类型?不管它是一个enum还是只是一个varchar(100)

谢谢!

4

2 回答 2

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
于 2013-09-24T13:16:24.230 回答
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

该文件将被放置在 lib/tasks 中,whatever_you_want_to_call_it.rake. 而不是rake db:test:prepare您将运行rake db:test_setup它将运行rake db:test:prepare,然后将枚举列更改为varchar(100)我相信将满足您的需求的 a。如果我错了,请纠正我。

Rake::Task['test:units'].invoke尽管我还没有对此进行测试,但您也应该可以在此处插入对 test:units 的调用。

同样,我通常不建议这样做,因为您确实在更改数据类型以及数据库如何处理它,但是由于这是您的要求,所以我想我会尝试提供帮助。

于 2013-09-23T18:10:55.713 回答