Тесты в Gem должны тестировать генератор миграции и применять миграции для тестов - PullRequest
2 голосов
/ 30 марта 2012

Я работаю над Gem, который содержит генератор миграции и несколько моделей, классов и т. Д., Которые используют таблицы, созданные как часть миграции.

Несмотря на то, что тестирование самого генератора миграции достаточно просто - существует множество учебных пособий для достижения этой цели, но я пытаюсь понять, как на самом деле запустить миграцию на тестовой БД, чтобы позже я смог проверить, как работает гем взаимодействует с данными теста?

Поскольку у гема нет schema.rb, я не знал, как это сделать.

Ответы [ 2 ]

1 голос
/ 08 апреля 2012

Так я запускаю миграции в коде;

  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)

Это должно дать вам перенесенную базу данных, используя сгенерированную вами миграцию.

0 голосов
/ 07 апреля 2012

Вы можете сделать что-то вроде этого:

Я собираюсь предположить, что вы используете 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}
...