假设我有一个列出文章的页面。控制器中的代码曾经是
# 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(...)
或者其他的东西。那么我的请求规范现在应该是什么样子?我不想只是将应用程序代码复制并粘贴到测试中,但与此同时,条件和排序现在相当复杂,所以测试所有预期元素的存在和顺序肯定会失败,除非我模拟索引控制器。
最好的方法是什么,避免专门测试,复制应用程序代码?将查询重构到某个中心位置(例如模型)并在测试中重新使用它?