我有一个模型规范抛出意外错误(没有正确构建对象)。 当我将相同的代码移到之前的测试中时,它运行顺利。
这是有问题的期望:
expect(title.full_title.length).to be <= 140
将行添加到第一个测试时,它通过了,而第二个测试失败了:
describe "generates a title" do
let(:collection) { FactoryBot.create(:collection) }
let(:items) { FactoryBot.create_list(:item, 10, collection: collection, chosen: true) }
let(:title) { Title.create_title(collection) }
context "happy path" do
it "assigns keywords by score" do
array = []
items.each do |i|
array << [i.search.term, i.search.score]
end
array.sort! { |a, b| a[1] <=> b[1] }
split_title = title.full_title.split(', ')
remaining_chars = 140
i = 0
split_title.each do |s|
if remaining_chars - s.length >= 0
expect(s).to eq(array[i][0])
i += 1
remaining_chars -= s.length
end
expect(title.full_title.length).to be <= 140
end
end
it "does not exceed 140 characters" do
expect(title.full_title.length).to be <= 140
end
end
这是错误信息,它没有创建对象:
1) Title generates a title happy path does not exceed 140 characters
Failure/Error: remaining_chars = 140 - keywords[0].length
NoMethodError:
undefined method `length' for nil:NilClass
TIA!
最佳答案
希望不大,但如果我今天运气好的话,让我们试试吧。
猜测:Title.full_title
实现(你没有分享)在某种程度上取决于 Item
的存在与用于初始化 Title
的集合相关对象。
如果该假设是正确的,则不同的行为来自 let
的惰性性质.
在第一个it
, 你实际上调用 items
(例如 items.each
)所以 let(:items)
被评估,数据库中的行被创建并且title.full_title
不返回 nil
.
有几种可能的修复方法:
- 改进
full_title
的实现总是返回字符串。 - 调用
items
在第二种情况之前
it "does not exceed 140 characters" do
items
expect(title.full_title.length).to be <= 140
end
- 使用
let!(:items)
这是立即评估的(不是懒惰的)
关于ruby-on-rails - 具有相同代码的 2 个测试之间的 Rspec 不一致结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428748/