我正在测试一些遗留代码。其中一个表格有一个enum
列。 (我知道,不要讨厌。我没有写它。)
在尝试运行单元测试之前,一切正常。突然,数据库架构将enum
列保存为varchar(0)
。显然不会让我设定任何价值。
这是我的大问题。如何为rake test:units
添加挂钩以调整列类型?如果它是enum
或仅varchar(100)
。
谢谢!
答案 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
来插入你的测试呼叫单元:虽然我没有对此进行测试。
再次黑客这样的事情并不是我一般会推荐的,因为你真的在改变数据类型以及数据库是如何处理的,但是因为这是你所要求的,我想我会尝试帮助。