ruby – 在RSpec测试中模拟ActiveRecord关系beheavior

我遇到这个问题与测试.假设我有两个模型,用户和帖子,其中user has_many:posts.

我试图指定一个代码块,其中包含以下内容

user = User.find(123)
post = user.posts.find(456)

我知道如何嘲笑User.find和user.posts部分. user.posts mock返回一个Post对象数组.当它得到.find(456)的一部分时,所有的事情都会被分解,没有给定例外.

所以我的问题是:由于user.posts模拟的结果返回的是什么,所以.find(456)方法可以工作吗? User.first.posts.class表示它是Array,但显然有更多的东西可以使AR风格的查找调用工作.我不喜欢在返回的对象上嘲笑find方法的前景.

PS在你建议一个明显和好的答案,停止嘲笑和使用夹具/种子测试数据库与必要的数据,这里是catch:遗留方案.用户后台都可以在数据库视图之上进行工作,而不是在表中进行更改,并将其更改为测试数据库中的表格似乎错误.

解决方法

问题是user.posts实际上并不是一个简单的数组;它是一个关联代理对象.存储它的方式可能是这样的(尽管确切的语法取决于您使用的嘲笑框架):
def setup
  @user = mock(User)
  User.stub(:find).with(123).return(@user)
  user_posts = mock(Object)
  @user.stub(:posts).return(user_posts)
  @post = mock(Post)
  user_posts.stub(:find).with(456).return(@post)
end

然后在你的测试中,User.find(123)将返回@user和@ user.posts.find(456)将返回@post.如果您需要@ user.posts在测试中像更多的Array一样,您可以创建一个mock(Array)并存放[](index)方法.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...