如何解决如何用复杂的查询测试控制器动作?
| 假设我有以下操作: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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。