为什么我在rspec中获得Active记录关系而不是Array?

时间:2017-11-28 18:08:24

标签: ruby-on-rails rspec

我在Post上运行测试:

expect(subject.query).to eq [previous_post, post, future_comment]

但是我收到了这个错误:

expected: [#<Post id: 3, body: "Sed quis aut harum. Asperiores ad commodi tempore ...", ...>]


got: #<ActiveRecord::Relation [#<Post id: 3, body: "Sed quis aut harum. Asperiores a.....>]>

它期望一个数组,但获得一个活动的记录对象。我该如何解决?

这是我正在测试的代码:

      def query
        scope = Post
                .where(user_id: user.id)
                .my_scope
                .my_other_scope
                .includes(:body)

        scope = case @options[:order_by]
                when "older"
                  order_by_older(scope)
                when "most_discussed"
                  order_by_most_discussed(scope)
                else
                  order_by_older(scope)
                end

        scope
      end

2 个答案:

答案 0 :(得分:2)

那是因为您使用的是where,而不是findfind_by,当您在使用的地方获得ActiveRecord::Relation作为结果 - 响应时,无论查询是否返回一个或多个结果。

如果你需要一个Post对象,那么考虑使用find,或者在使用where的情况下,确保在里面指定任何特定的元素。

您可以尝试(未经测试):

def query
  scope = Post.find_by('user_id = ?', user.id)
              .my_scope
              .my_other_scope
              .includes(:body)

  case @options[:order_by]
  when 'older' then order_by_older(scope)
  when 'most_discussed' then order_by_most_discussed(scope)
  else order_by_older(scope)
  end
end

答案 1 :(得分:2)

您可以更新要使用的规范。

expect(subject.query).to contain_exactly(previous_post, post, future_comment)

如果它是您的代码中的依赖项,那么您可以使用它将其转换为数组 @MrYoshiji提到.to_a

如果可以避免,我不建议将其转换为数组,原因是速度较慢。