【发布时间】:2021-12-17 09:47:28
【问题描述】:
在 Rspec 中遇到问题。假设我有这个:
class Book; has_many: :pages; end
class Page; belongs_to: :book; end
describe Pages
let(:book) { create(:book) }
let(:page) { create(:page, book: book) }
before do
allow(page).to receive(:last_page?).and_return(last_page)
book.pages << page
end
context "weird behavior" do
let(:last_page) { "Orange" }
it do
# these two pass as expected
expect(book.pages.first).to eq page # passes, as expected
expect(book.pages.first.last_page?).to eq "Orange" # passes, as expected
# this is where weird things happen
expect(book.pages.order("created_at DESC").first).to eq page # passes, as expected
expect(book.pages.order("created_at DESC").first.last_page?).to eq "Orange" # will fail and return the actual method call
end
end
end
为什么 ".order("created_at DESC")" 会弄乱 "allow" 语句,即使实际对象仍然相等?
【问题讨论】:
-
如果这是整个规范文件
expect(book.pages.first.last_page?).to eq "Orange"没有通过,last_page?仍然会从未被存根的book.pages.first调用。 -
也许澄清你的意图会引导你找到更好的方法。
-
.last_page?应该按照 Ruby 约定返回一个布尔值。它返回一个字符串的事实本身就是一个 WTF 时刻。 -
@SebastianPalma 你是对的,那条线实际上没有通过。但是,当我在控制台中调试时,如果我运行
book.pages然后book.pages.first.last_page?,我会得到“橙色”。如果我运行“book.pages.reload.first.last_page?”,那么它会返回到方法调用。知道为什么吗?
标签: ruby-on-rails rspec