我使用 Rails 3.0.4 和 RSpec 2.5。在我的控制器中,我大量使用命名范围,例如
@collection = GuestbookEntry.nonreplies.bydate.inclusive.paginate( :page => params[:page], :conditions => { ... })
在我的测试中,我希望能够模拟这样一个查询的结果,而不是措辞。我认为做类似的事情没有意义
GuestbookEntry.stub_chain(:nonreplies, :bydate, ...).and_return(...)
因为当我决定重新排序命名范围时,此测试将失败。
使用 Rails 2.3 和 RSpec 1.x,这工作得很好:我可以写
GuestbookEntry.should_receive(:find).with(:all, :conditions => { ... })
并且上述调用将被捕获并正确处理。然而,在 Rails 3 中,由于某种原因,这不再起作用。
为什么?如何对嵌套范围的结果设置期望值或存根?由于 Rails 3 的 ActiveModel 中的所有内容都是一个命名范围(感谢 ARel),因此这必须以某种方式实现,否则测试确实会非常脆弱。
谢谢!
更新:另见GitHub 上的问题报告。