加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 22:36:40 所属栏目:百科 来源:网络整理
导读:我遇到这个问题与测试.假设我有两个模型,用户和帖子,其中user has_many:posts. 我试图指定一个代码块,其中包含以下内容: user = User.find(123)post = user.posts.find(456) 我知道如何嘲笑User.find和user.posts部分. user.posts mock返回一个Post对象数
我遇到这个问题与测试.假设我有两个模型,用户和帖子,其中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)方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读