我正在使用Postgres 9.3测试Rails 4.2.x应用程序中的迁移,并提出了以下似乎可行的方法。我添加了一个迁移" AddCarIdToWheels"到测试数据库并使用现已弃用的rake db:test:prepare
运行它。
在context up
部分,而不是AddCarIdToWheels.down
,我想执行ActiveRecord::Migrator.migrate @previous_version
之类的操作,以便将数据库重置为car_id
列之前的状态被添加到Wheels表中。但如果我这样做而不是AddCarIdToWheels.down
,我会得到一个"列已经存在" Postgres测试数据库中的错误。
如何编写"上下文" rspec测试所以它不依赖于数据库的状态,即已经添加了car_id
列?
是否可以在不删除测试数据库的情况下执行此操作?如果我删除该表,我想我将不得不手动重新创建用户名和密码,以便在每次单次测试运行时从命令行访问测试数据库,这太费时了。
我用了#34; Start Testing Your Migrations. (Right Now)"作为指导。
规格/ add_car_id_to_wheels_spec.rb:
require 'spec_helper'
require File.join(File.dirname(__FILE__), "..", "..", "db", "migrate", "20150609194738_add_car_id_to_wheels")
RSpec.describe "AddCarIdToWheels" do
before do
@current_version = '20150609194738'
@previous_version = '20150528183542'
end
context "up" do
before do
AddCarIdToWheels.down
puts "Testing up migration for #{@current_version} - resetting to #{@previous_version}"
end
it "adds the car_id column to the wheels table", :please_truncate=>true do
expect {
AddCarIdToWheels.up
Wheel.reset_column_information
}.to change { Wheel.columns }
expect(Wheel.column_names).to include("car_id")
end
end
context "down" do
before do
ActiveRecord::Migrator.migrate @current_version
puts "Testing down migration for #{@current_version} - resetting to #{ActiveRecord::Migrator.current_version}"
end
it "removes the car_id column to the wheels table" do
expect {
AddCarIdToWheels.down
Wheel.reset_column_information
}.to change { Wheel.columns }
expect(Wheel.column_names).not_to include("car_id")
end
end
end