如何用复杂的查询测试控制器动作?

| 假设我有以下操作:
def index
  @posts = Post.joins(:tags).where(:tags => {:id => params[:tag_id]})
end
它向视图显示
@posts
,它将显示带有给定标签的每个帖子。 一切正常,但是我一直想找出最好的测试方法。 我不太喜欢嘲笑,因为如果我将该行更改为:
@posts = Post.where(:tags => {:id => params[:tag_id]}).joins(:tags)
我真的不想打数据库,因为它会降低测试速度,但是我正在考虑将查询提取到模型内部的方法,并在其中进行测试(如果这是唯一的方法)去做吧。 编辑:是的,我知道我可以在这种情况下使用
Tag.find(params[:tag_id])
,但这不是问题所在。我只是不想在查询中引入另一个模型,而使解释重点与实际问题的难度变得更大,那就是:我们应该在控制器中保留复杂的查询吗?如果是这样,最好的测试方法是什么?     
已邀请:
这就是我喜欢做的。通常,我喜欢将数据库测试集成到我的测试中(尽管有些人会不同意,我个人很喜欢)。我将创建3个factory(:post)以及一些标记作为虚拟数据,然后我将调用控制器并检查接收到的@posts是否是我所期望的。     
因此,根据注释提取到模型是最好的方法。这就是我的做法: post.rb:
class Post
  scope :tagged_as, lambda {|tag_id| where(:tag_id => tag_id)}
end
posts.yml:
one:
  title: Post 1
  tags: one, three

two:
  title: Post 2
  tags: two, three
post_test.rb:
test \'find by tag\' do
  posts = Post.tagged_as(tags(:one))
  assert_includes posts, posts(:one)
  refute_includes posts, posts(:two)
end
    

要回复问题请先登录注册