ruby-on-rails-3 – Rails 3,RSpec 2.5:使用带有命名范围的should_receive或stub_chain

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – Rails 3,RSpec 2.5:使用带有命名范围的should_receive或stub_chain前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用的是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),所以这必须以某种方式进行,否则测试确实很脆弱.

谢谢!

更新:另见issue report on GitHub.

解决方法

这个问题已经使我一段时间了!

我相信行为与Rails 2不同的原因是因为在控制器中的变量赋值期间不再执行查询.相反,它根据需要懒惰加载.

我同意Mark Wilden的说法,最好将所有这些范围放在更大的范围内,并在您的模型中进行规范.这个范围显然有一个特定的功能,所以就像一个方法的行为一样,它调用了其他几种方法,你可以指定连接其他几个范围的作用域的行为.

原文链接:https://www.f2er.com/ruby/271360.html

猜你在找的Ruby相关文章