2012-03-30 4 views
2

Ich arbeite an einem Gem, das einen Migrationsgenerator und eine Reihe von Modellen, Klassen usw. enthält, die die Tabellen verwenden, die als Teil der Migration erstellt wurden.Tests in Gem müssen Migrationsgenerator testen und Migrationen für Tests anwenden

Obwohl das Testen des Migrationsgenerators selbst einfach ist - es gibt viele Tutorials um das zu erledigen, was ich versuche herauszufinden, wie man die Migration tatsächlich auf der Test-DB durchführt, damit ich später testen kann wie Edelstein interagiert mit den Testdaten?

Da der Edelstein kein schema.rb hat, war ich nicht sicher, wie man es macht.

Antwort

1

Dies ist, wie ich Migrationen in Code ausführen;

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) 

Wenn Sie eine Zeichenfolge haben, die Ihre generierte Migration enthält, könnten Sie in Ihrem Test-Setup so etwas tun;

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) 

Das sollte Ihnen eine migrierte Datenbank mit der von Ihnen generierten Migration geben.

0

Sie können etwas tun:

ich Sie verwenden Active zu übernehmen werde. Also in Ihrem Test Helfer in-Memory-Setup eine Datenbank sollen Sie:

require 'active_record' 

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

rufen dann die Rake-Aufgabe in Ihrem Test. Dies würde in etwa so aussehen:

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 

Der Rake taks Aufruf ist nicht getestet, aber das sollten Sie in die richtige Richtung weisen.

wäre die andere Option nur den Befehl auszuführen:

%x{rake db:migrate}