【问题标题】:Testing validity of database seed file in rails在rails中测试数据库种子文件的有效性
【发布时间】:2019-01-21 15:27:35
【问题描述】:

随着代码的增长,种子文件可能会很快失效。我刚刚遇到了一种情况,即打开的合并请求使所有测试都运行并通过了,但是当我在登台服务器上运行 rails db:seed 时失败,因为种子文件没有该特定模型的所有必需字段。 有没有一种方法可以始终测试种子文件的有效性?

可能相关:

  • 我正在使用 gitlab CI 运行 CI 和部署
  • rails 版本 - 5.2
  • rspec 版本 3

【问题讨论】:

  • 您可以编写一个运行 rails db:seed 的简单规范,并编写有关返回值的期望,以及可能发生的数据库突变。
  • 如何在 rspec 测试中运行rails db:seed ?我知道使用 FactoryBot 但不使用种子文件
  • expect(system("rails db:seed")).to be_truthy - 请参阅 stackoverflow.com/questions/6338908/… 了解有关如何运行它的许多其他选项。
  • 还有更多奇特的方法来测试 rake 任务("rails db:seed" 实际上只是“rake db:seed”的别名)。 robots.thoughtbot.com/test-rake-tasks-like-a-boss

标签: ruby-on-rails ruby rspec


【解决方案1】:

您可以定义一个运行 rails db:seed 的单独 CI 任务,旁边是运行 rspec(或 rails spec,或它使用的任何拼写)的现有 CI 任务。

【讨论】:

  • 如果管道失败,它会阻止管道移动到下一步吗?
  • 是的,如果遇到异常,ruby 会以非零状态退出,CI 会将其视为失败
  • 好的,让我和rspec 一起运行并行作业,看看是否通过
  • 这行得通,我添加了一个并行作业,现在如果播种失败,它不会部署
【解决方案2】:

事实证明,使用 RSpec 进行测试非常简单:

require 'rails_helper'
RSpec.describe "db:seed" do
  it "works" do
    expect { Rails.application.load_seed }.to_not raise_error
  end
  it "creates a foo" do
    expect { Rails.application.load_seed }.to change(Foo, :count)
  end
end

这是可以预料的,因为“播种”实际上只需要一个 ruby​​ 文件。

Rails.application.load_seedrake db:seed 任务使用(在 Rails 5+ 中也称为 rails db:seed)。

【讨论】:

  • 这假设您使用database_cleaner 进行清理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2012-12-09
  • 1970-01-01
  • 2010-12-26
  • 2017-08-17
  • 2017-01-17
  • 1970-01-01
相关资源
最近更新 更多