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

前端之家收集整理的这篇文章主要介绍了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)方法.

猜你在找的Ruby相关文章