Plugins - Migration Test Helper

StarAdd to favorites

migration_test_helper adds helper methods to Test::Unit::TestCase which let you assert the current state of the schema and run your migrations against the test database.

assert_schema: verifies the schema of the database exactly matches the one specified.

def test_the_schema
  assert_schema do |s|
    s.table :books do |t|
      t.column :id,     :integer
      t.column :title,  :string
      t.column :author, :string
    end

    s.table :reviews do |t|
      t.column :id,      :integer
      t.column :book_id, :integer
      t.column :body,    :text
      t.column :rating,  :integer
    end
  end
end

   

This would verify there are only two tables defined in the test database: books and reviews (schema_info is ignored). It will also verify that the book table has the three columns, id, title and author, each with their respective types.

drop_all_tables: does just what it says to your test database.

migrate: executes the migrations against the test database using the same mechanism as rake db:migrate.

def test_the_migrations
  migrate
  migrate :version => 0
  migrate :version => 10
  migrate
end

   

This would do the same thing as running the following rake commands, but within a test case:

rake db:migrate
rake db:migrate VERSION=0
rake db:migrate VERSION=10
rake db:migrate

   

By combining the two helpers you can write a test that shows you can run all your migrations and get the final schema:

def test_should_be_able_to_migrate_from_an_empty_schema
  drop_all_tables

  # we shouldn't have any tables
  assert_schema do |s|
  end

  migrate  

  assert_schema do |s|
    s.table :books do |t|
      t.column :id,     :integer
      t.column :title,  :string
      t.column :author, :string
    end

    s.table :reviews do |t|
      t.column :id,      :integer
      t.column :book_id, :integer
      t.column :body,    :text
      t.column :rating,  :integer
    end
  end
end

   

The migrate helper can also be useful for testing data tranformation migrations:

def test_should_get_rid_of_bad_data
  drop_all_tables
  migrate :version => 7
  book = Book.create! :title => "bad title\nwith\todd    spacing"
  migrate :version => 8 # should cleanse spacing in book titles
  book.reload
  assert_equal "bad title with odd spacing", book.title
end

Micah Alles

http://migrationtest.rubyforge.org

svn://rubyforge.org/var/svn/migrationtest/tags/migration_test_helper

Rails' (MIT)

  • Currently 5.0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Testing

Tags

Comments

Add a comment

Search Plugins

Query syntax

Plugins by Category

Sponsors

Rails Kits: Get Code. Get Moving.

Have a comment?