微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/ruby/271360.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐