我在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
答案 0 :(得分:2)
那是因为您使用的是where
,而不是find
或find_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
如果可以避免,我不建议将其转换为数组,原因是速度较慢。