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