2012-03-30 6 views
2

マイグレーションの一部として作成されたテーブルを利用するマイグレーションジェネレータとモデル、クラスなどが含まれているGemに取り組んでいます。Gem内のテストでマイグレーションジェネレータをテストし、マイグレーションをテストに適用する必要があります

マイグレーションジェネレータそのものをテストするのは簡単ですが、実際にテストDBでマイグレーションを実行する方法を教えてください。宝石はテストデータと相互作用しますか?

宝石にはschema.rbがないので、どうやってそれを行うかについてはわかりませんでした。

答えて

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) 

これは、作成した移行を使用して移行されたデータベースを提供するはずです。

0

あなたはこのような何かを行うことができます。私はあなたがActiveRecordのを使用していると仮定するつもりです

。したがって、テストヘルパーでメモリ内のデータベースをセットアップする必要があります。

require 'active_record' 

# Connection must be establised before anything else 
ActiveRecord::Base.establish_connection(
    :adapter => defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3', 
    :database => ':memory:' 
) 

次に、テスト内でレーキタスクを呼び出します。これは次のようになります。

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 

をすくいtaksの呼び出しがテストされていないが、それは正しい方向にあなたを指している必要があります。

他のオプションは、単にコマンドを実行するために、次のようになります。

%x{rake db:migrate} 
関連する問題