【问题标题】:MIgrations and Rspec迁移和 Rspec
【发布时间】:2010-05-24 15:29:33
【问题描述】:

我正在使用 Rspec 开发 Rails 应用程序以进行单元测试。

几周前,Rspec 在执行 'rake spec' 时会自动将数据库迁移到最新版本,但现在它不会自动执行,我必须自己实现所有内容。

这发生在测试环境中,因为我的开发数据没有消失。

是我的错吗?我没有改变任何东西,我想:)

【问题讨论】:

  • 您在尝试执行“rake spec”时是否遇到任何错误?
  • 如果我生成迁移,则会出现“您有待处理的迁移”。此时我必须自己迁移数据库,并重新运行“rake spec”

标签: ruby-on-rails rspec


【解决方案1】:

通常我所做的是使用运行迁移和准备测试数据库的别名命令。

rake db:migrate && rake db:test:prepare

在您的 .bashrc 中,只需像这样创建一个别名命令,然后在需要时运行 migrate_databases。

alias migrate_databases='rake db:migrate && rake db:test:prepare'

【讨论】:

  • 我更喜欢解决问题而不是隐藏它,但谢谢。顺便说一句,很抱歉一个月后回答:)
【解决方案2】:

我对 Rails 4 的解决方案:

spec/spec_helper.rb或测试环境初始化代码中的任何地方:

# Automigrate if needs migration
if ActiveRecord::Migrator.needs_migration?
  ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate'))
end

UPD: 正如 Dorian 在 cmets 中亲切指出的那样,您无需单独检查是否有任何待处理的迁移,因为 ActiveRecord::Migrator.migrate 已经在幕后执行此操作。所以你可以有效地使用这一行:

ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate'))

【讨论】:

  • db:test:clone 在 Rails 4.1 中已弃用
  • 您通过运行ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate')) 的行为和更短的代码来执行两个 SQL 请求而不是一个。
【解决方案3】:

您可以使用 Rails 4.1 前进:

ActiveRecord::Migration.maintain_test_schema!

在您的spec_helper.rbrails_helper.rb 顶部添加,您就可以开始了。 More info here.

【讨论】:

  • 你能告诉我一些关于它是如何不起作用的细节吗?它会引发某种错误吗?您可能需要确保您的迁移也在开发模式下运行才能正常工作。
  • 创建新迁移然后运行 ​​rspec 时会引发错误
  • 您首先使用 rake db:migrate 运行迁移?
【解决方案4】:

这是我的解决方法:

瑞克文件:

require File.expand_path('../config/application', __FILE__)
require 'rake'
require "rspec/core/rake_task"

MyApp::Application.load_tasks

desc "Run specs"
RSpec::Core::RakeTask.new(:spec)

task :run_specs => ['db:test:clone', :spec] do

end

task :default => :run_specs

然后我运行 $ rake run_specs

由于某种原因,默认任务不默认为 run_specs

【讨论】:

    【解决方案5】:

    看看你的 spec_helper.rb 中是否有以下内容?每次运行规范时,RSpec 都会检查是否有待处理的迁移。

    #Checks for pending migrations before tests are run.
    #If you are not using ActiveRecord, you can remove this line.
    ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
    

    【讨论】:

      【解决方案6】:

      即使在 Rails 没有加载并且大部分时间只执行一个 SQL 查询时,这仍然有效。

      if defined?(ActiveRecord::Migrator)
        ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db', 'migrate'))
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        相关资源
        最近更新 更多