我正在将旧项目升级到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
有什么想法吗?
答案 0 :(得分:0)
destroy
在活动记录对象上会将其从数据库中删除,但该对象仍保留在内存中。
最好是
item_run.reload
早于预期,但是根据您定义关系的方式,您可能会得到一个找不到item_template
的错误。
如果您的“ item_template”具有
has_many :item_runs, dependent: :nullify
那么就不会有错误(假设item_run
有belongs_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
。