我正在测试一些遗留代码。其中一张桌子有一个enum
列。(我知道,不要讨厌。我没有写)。
在尝试运行单元测试之前一切正常。突然,数据库模式将enum
列保存为varchar(0)
. 显然不允许我设置任何值。
这是我的大问题。如何添加一个钩子来rake test:units
调整列类型?不管它是一个enum
还是只是一个varchar(100)
。
谢谢!
我正在测试一些遗留代码。其中一张桌子有一个enum
列。(我知道,不要讨厌。我没有写)。
在尝试运行单元测试之前一切正常。突然,数据库模式将enum
列保存为varchar(0)
. 显然不允许我设置任何值。
这是我的大问题。如何添加一个钩子来rake test:units
调整列类型?不管它是一个enum
还是只是一个varchar(100)
。
谢谢!
所以这个问题的解决方案比我预期的要简单。在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
好的,我并不是建议将其作为所有问题的解决方案,但在这种情况下,您可以在自己的 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 的调用。
同样,我通常不建议这样做,因为您确实在更改数据类型以及数据库如何处理它,但是由于这是您的要求,所以我想我会尝试提供帮助。