【问题标题】:rspec not destroying record and failing testrspec 不破坏记录和未通过测试
【发布时间】:2018-10-05 14:13:05
【问题描述】:

我正在将一个遗留项目升级到 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

有什么想法吗?

【问题讨论】:

  • 请发布ItemTemplate的相关代码,从提供的摘录中不清楚为什么title应该改变。

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


【解决方案1】:

活动记录对象上的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_templateitem_run 是否应该存在?

如果没有,那么做

has_many :item_runs, dependent: :destroy

这将自动销毁item_run

【讨论】:

  • item_template has_many :item_runs,dependent: :destroy and reload item_run 给我一个未定义的方法“reload”#<:examplegroups...>
  • 对不起,我的意思是 item_run.reload ... 查看更新的答案。
  • 谢谢!做到了。任何机会你都可以看看这个:stackoverflow.com/questions/52656005/…这可能是一个类似的问题
猜你喜欢
  • 2011-10-28
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多