【问题标题】:How to run migrations for test suite.如何为测试套件运行迁移。
【发布时间】:2018-11-11 02:46:27
【问题描述】:

我有一个使用 ActiveRecord 和 sqllite 的 ruby​​ 应用程序。我正在尝试编写测试,但出现此错误:

 Failure/Error: user = described_class.create(name: name)

     ActiveRecord::StatementInvalid:
       Could not find table 'users'

这是我的 gemfile:

source "https://rubygems.org"

gem "sinatra-activerecord"
gem "sqlite3"

group :test do
  gem 'database_cleaner'
end

group :test, :development do
  gem "rspec-rails", ">= 2.1.0"
  gem "pry"
end

我有一个如下所示的 spec_helper:

RSpec.configure do |config|


  ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'db/test.db')
end

我可以做些什么来创建一个测试数据库并为我的 sqllite 测试运行迁移?

【问题讨论】:

    标签: ruby activerecord rspec


    【解决方案1】:

    bin/rails RAILS_ENV=test db:migrate 和/或bin/rails db:test:prepare 将更新您的测试数据库。您可能还想查看Rails Testing Guides - 那里有很多有用的信息。或者,如果您想避免使用固定装置,FactoryBot 非常适合生成测试数据。

    【讨论】:

    • Ginnie 在这里的回答是完美的,只是 OP 没有指定应用程序使用 Rails。 ActiveRecord 任务/迁移是对所提出问题的一个很好的解决方案,并且可以在 Rails 之外完成(尽管它需要一些额外的修补)。将rails 扔到Gemfile 以获得简单的解决方案,或者给迁移指南一个很好的通读以更好地理解api:guides.rubyonrails.org/active_record_migrations.html
    • 好点,Sean Huber,我没有注意到 sinatra gem。我很少使用 Sinatra。 “rspec-rails” gem 是否可以与 Sinatra 一起使用?
    • 从 rspec-rails github.com/rspec/rspec-rails/blob/master/rspec-rails.gemspec 中列出的运行时依赖项中,我看到了 activesupport、actionpack 和 railties 的运行时依赖项。我相信你可以只用 sinatra 和这些 rails 组件建立一个项目,并让 rspec-rails + 活动记录迁移工作。但在我看来,如果你引入了所有这些 rails gem,你还不如在 rails 之上构建你的应用程序,而不是自己拼凑起来。好问题。
    • 另外,db:test:prepare4.1 中已被弃用,此后已被完全删除
    【解决方案2】:

    Ginnie 的回答可行,但如果像 Sean 提到的那样,您需要一个仅 ActiveRecord 的解决方案而不是使用 Rails,请考虑以下问题:

    我最近开发了一个 gem 来捆绑一些 ActiveRecord 模型而不使用 Rails。 以下是我使用 rspec 测试我的模型时所做的:

    spec/spec_helper.rb:

    ActiveRecord::Base.establish_connection(adapter: 'sqlite3',
                                            database: ':memory:')
    ActiveRecord::Schema.define do
      require_relative '../lib/db/migrate/create_models'
    end
    

    lib/db/migrate/create_models.rb:(为了制作这个文件,我复制/粘贴了迁移生成的实际 schema.rb)

    class CreateModels < ActiveRecord::Migration[5.1]
     create_table "users", force: :cascade do |t|
       t.string "uid", default: "", null: false
       t.string "email", null: false
       // other attributes
     end
     // other tables
    end
    

    这将为您的测试创建运行所需的表。

    不要忘记在您的 *_spec.rb 文件中使用 spec_helper ,一切顺利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 2018-10-17
      • 2017-10-15
      • 2011-10-15
      • 2010-12-03
      • 2021-02-02
      • 2021-02-24
      • 2018-10-06
      相关资源
      最近更新 更多