Gem中的测试需要测试迁移生成器并应用迁移进行测试

时间:2012-03-30 05:39:57

标签: ruby testing tdd gem rails-migrations

我正在开发一个Gem,它包含一个迁移生成器和一堆模型,类等,它们利用在迁移过程中创建的表。

虽然测试迁移生成器本身很容易 - 有很多教程可以完成,我正在尝试解决的是如何在测试数据库上实际运行迁移,以便稍后测试gem如何与测试数据交互?

由于gem没有schema.rb,我不知道如何去做。

2 个答案:

答案 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}