如何使用复杂查询测试控制器操作?

时间:2011-04-13 20:55:45

标签: ruby-on-rails ruby testing controller functional-testing

假设我有以下行动:

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]),但这不是问题所在。我只是不想在查询中引入另一个模型,并且更难以解释偏离真正问题的焦点,即:我们应该在控制器中保留复杂的查询吗?如果是这样,测试它的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

这就是我喜欢做的事情。一般来说,我喜欢在我的测试中集成数据库测试(虽然有些人不同意,我个人喜欢它)。我会创建像3个工厂(:post)和一些标签作为虚拟数据然后我会调用控制器并检查收到的@posts是否是我期望的。

答案 1 :(得分:0)

因此,根据提取给模型的评论是最好的事情。这就是我做到的:

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