【发布时间】:2013-06-08 11:31:34
【问题描述】:
假设我有一个列出文章的页面。控制器中的代码以前是
# articles#index
@articles = Article.paginate(page: params[:page], per_page: 10, order: :title)
我的测试是这样的
# spec/requests/article_pages_spec
Article.paginate(page: 1, per_page:10, order: :title).each do |a|
a.should have_selector('h3', text: a.title)
end
好的。现在我的代码改变了一堆。索引就像
@articles = Article.find(:all, conditions: complicated_status_conditions)
.sort_by { |a| complicated_weighted_rating_stuff }
.select { |a| complicated_filters }
.paginate(...)
什么的。那么我的请求规范现在应该是什么样子?我不想只是将应用程序代码复制并粘贴到测试中,但与此同时,条件和排序现在相当复杂,所以测试所有预期元素的存在和顺序肯定会失败,除非我模拟索引控制器。
最好的方法是什么,避免专门测试,复制应用程序代码?将查询重构到某个中心位置(例如模型)并在测试中重用它?
【问题讨论】:
-
为什么代码变了?有没有新的要求?如果是这样,测试应该反映新的要求。
-
是的,有几个复杂的排序和过滤要求。例如,按加权评分排序,并在加权评分上添加时间衰减。在测试中试探性地这样做似乎不精确,并且不会产生与实际代码相同的结果,但在测试中复制相同的查询似乎是多余的......
标签: ruby-on-rails testing rspec