ruby-on-rails - 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
有任何想法吗?
解决方案
destroy
在活动记录对象上会将其从数据库中删除,但该对象仍保留在内存中。
更好的是做一个
item_run.reload
在期望之前,但根据您定义关系的方式,您可能会收到item_template
未找到的错误。
如果您的“item_template”有
has_many :item_runs, dependent: :nullify
那么就不会有错误(假设item_run
有belongs_to :item_template, optional: true
)
但是 as item_run
will have no item_template
then doingitem_run.item_template.title
会给你一个错误,即在 Nil:NilClass 上没有方法。
潜在的问题是......应该item_run
存在没有item_template
?
如果没有,那么做
has_many :item_runs, dependent: :destroy
这将item_run
自动销毁。
推荐阅读
- c# - 根据最大值插入具有字段值的记录
- junit - 如何在 Java 中导入“@Test”方法
- javascript - 从 innerHTML 中仅删除文本
- firebase - Xamarin Firebase Cloud 消息间歇性不起作用
- jquery - DataTables将排序图标放在指定为没有的列上
- django - 在 Docker 中使用 Django 无法获取 rest api
- flutter - 如何在 GridView 中每 6 个不同的项目渲染一个图像?
- reactjs - 使用到达路由器检测路由是否是初始页面加载?
- c# - 如何从 .py 文件中读取代码作为 C# 中的字符串?
- python - Django:如何通过唯一约束字段的验证以更新模型记录