如何在Rails 4迁移测试期间将PostgreSQL数据库重置为以前的状态?

时间:2015-06-09 22:41:34

标签: ruby-on-rails ruby postgresql rspec

我正在使用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

0 个答案:

没有答案