首页 > 解决方案 > rspec 不破坏记录和未通过测试

问题描述

我正在将一个遗留项目升级到 rails 5.0 并且一些测试失败了。我有以下测试:

describe ItemRun do
  describe "#item_template" do
    context "with an item template that has been deleted" do
      let(:item_template) { ItemTemplate.create! title: "Hello" }
      let!(:item_run) { item_template.item_runs.create! title: "Testing" }

      before do
        item_template.update_attributes(deleted: true)
      end

      it "responds to :title" do
        expect(item_run.item_template.title).to eq ""
      end
    end
  end
end

错误报告如下:

ItemRun#item_template with a item template that has been deleted responds to :title
     Failure/Error: expect(item_run.item_template.title).to eq ""

       expected: ""
            got: "Hello"

       (compared using ==)
     # ./spec/models/item_run_spec.rb:14:in `block (4 levels) in <top (required)>'

我也尝试过item_template.destroy,但得到了相同的结果。

item_template.rb定义了以下类:

  class NullObject
    def title
      ""
    end
  end

有任何想法吗?

标签: ruby-on-railstestingrspecruby-on-rails-5

解决方案


destroy在活动记录对象上会将其从数据库中删除,但该对象仍保留在内存中。

更好的是做一个

item_run.reload

在期望之前,但根据您定义关系的方式,您可能会收到item_template未找到的错误。

如果您的“item_template”有

has_many :item_runs, dependent: :nullify

那么就不会有错误(假设item_runbelongs_to :item_template, optional: true

但是 as item_runwill have no item_templatethen doingitem_run.item_template.title会给你一个错误,即在 Nil:NilClass 上没有方法。

潜在的问题是......应该item_run存在没有item_template

如果没有,那么做

has_many :item_runs, dependent: :destroy

这将item_run自动销毁。


推荐阅读