我正在开发一个Gem,它包含一个迁移生成器和一堆模型,类等,它们利用在迁移过程中创建的表。
虽然测试迁移生成器本身很容易 - 有很多教程可以完成,我正在尝试解决的是如何在测试数据库上实际运行迁移,以便稍后测试gem如何与测试数据交互?
由于gem没有schema.rb,我不知道如何去做。
答案 0 :(得分:1)
这就是我在代码中运行迁移的方式;
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
ActiveRecord::Migration.verbose = false
@migration = Class.new(ActiveRecord::Migration) do
def change
create_table :users, :force => true do |t|
t.string :roles_mask
end
create_table :user_without_roles, :force => true do |t|
t.string :roles_mask
end
create_table :user_without_role_masks, :force => true do |t|
end
end
end
@migration.new.migrate(:up)
如果您有一个包含生成的迁移的字符串,您可以在测试设置中执行以下操作;
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
ActiveRecord::Migration.verbose = false
# Or however you intend to grab the output of the migration generator
migration_string = ERB.new(File.read(<file name here>)).result
migration = Class.new(ActiveRecord::Migration)
migration.class_eval(migration_string)
migration.new.migrate(:up)
这应该使用您生成的迁移为您提供迁移的数据库。
答案 1 :(得分:0)
您可以这样做:
我假设您正在使用ActiveRecord。因此,在您的测试助手中,您应该设置一个内存数据库:
require 'active_record'
# Connection must be establised before anything else
ActiveRecord::Base.establish_connection(
:adapter => defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3',
:database => ':memory:'
)
然后在测试中调用rake任务。这看起来像是:
require 'rake'
requie File.expand_path('../Rakefile', __FILE__) # you'll need to modify this path to actually point to the Rakefile
Rake::Task['db:migrate'].invoke
rake taks调用未经测试,但这应该指向正确的方向。
另一种选择是运行命令:
%x{rake db:migrate}