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

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)方法.

原文地址:https://www.jb51.cc/ruby/265811.html

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

相关推荐