rspec不会破坏记录并且测试失败

时间:2018-10-05 14:13:06

标签: ruby-on-rails testing rspec ruby-on-rails-5

我正在将旧项目升级到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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

最好是

item_run.reload

早于预期,但是根据您定义关系的方式,您可能会得到一个找不到item_template的错误。

如果您的“ item_template”具有

has_many :item_runs, dependent: :nullify

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

但是由于item_run将没有item_template,所以进行item_run.item_template.title会给您一个在Nil:NilClass上没有方法的错误。

基本问题是...是否应该存在没有item_run的{​​{1}}?

否则请

item_template

这将自动破坏has_many :item_runs, dependent: :destroy