Testing migrations
I am not aware of any good, quick and robust way of testing migrations in ruby applications. Well,
whether the migrations just creates a new table it’s usually safe to rely on those guys in
Rails team who implemented create_table
.
But in real life we often have a legacy data to be transposed into new structure in some cumbersome way. Imagine the address field to be splitted into three brand new fields: a zip, a street name and the number of a house. OK, we write a migration, that introduces new three fields in the respective table, converts data using regular expressions (hey, we have 100K records, if you know the better, please drop me an email,) drops the original field.
So far, so good. The migration looks like a brilliant piece of code, it runs smoothly on fixtures etc. Well done? Or is it still medium rare?
Of course, we need to test the migration. Nobody wants to send 100K of commercials next month to irrelevant addresses, right? How to do it?
There is quick and dirty approach. If one knows “potentially problematic” addresses,
she might create a simple fixture with that data and run the migration down
and
then back up
. That simple.
require_relative File.join Rails.root,
'db',
'migrate',
'20151119020000_convert_addresses_to_new_format.rb'
context '#up' do
before do
ConvertAddressesToNewFormat.new.down
apply_legacy_data_fixtures
load_new_data_fixtures
end
it 'should convert data properly' do
ConvertAddressesToNewFormat.new.up
Address.all.each do |a|
expect(a.zip).to be_present
...
end
end
end
The same might be easily done to test #down
migration.