代码之家  ›  专栏  ›  技术社区  ›  Toms Mikoss

模拟活动记录关系在RSPEC测试中的应用

  •  11
  • Toms Mikoss  · 技术社区  · 15 年前

    我在测试中遇到了这个问题。假设我有两个模型,用户和发布,其中用户有多个:发布。

    我正在尝试规范一个代码块,它包含如下内容:

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

    我知道如何模仿 User.find user.posts 部分。这个 用户名 mock返回post对象数组。当它到达 .find(456) 一部分,一切都被 no block given 例外。

    所以我这里的问题是:作为 用户名 嘲笑,这样 查找(456) 方法对它有效吗? User.first.posts.class 说它是数组,但显然还有其他东西可以使ar风格的find调用起作用。对于在返回的对象上模拟find方法的前景,我并不高兴。

    ps在您建议停止嘲笑和使用fixtures/用必要的数据播种测试数据库之前,这里是catch:legacy方案。用户和post都是在数据库视图而不是表之上工作的,并且更改它使它们成为测试数据库中的表对我来说似乎是错误的。

    2 回复  |  直到 10 年前
        1
  •  16
  •   James A. Rosen    15 年前

    问题是 user.posts 不是 事实上 简单的 Array ;它是关联代理对象。存根的方法可能是这样的(尽管确切的语法取决于您使用的模拟框架):

    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 表现得更像 数组 在测试中,可以创建 mock(Array) 并存根 [](index) 方法。

    推荐文章