在Rails 3中,当在MiniTest中编写功能测试时,我养成了测试路由与测试控制器操作分开的习惯.我从Rails指南测试中得到了这个想法- 第9节:测试路径.但是,在将我的应用程序升级到Rails 4之后,我注意到如果我没有为get|patch|post|delete方法提供一组适当的参数,那么控制器动作测试本身已经开始涉及未知路由.
例如,给定路线:
# config/routes.rb
namespace "api" do
namespace "v2", defaults: { format: :json } do
resources :users do
resources :posts do
resources :comments
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
和功能测试:
# test/controllers/api/v2/comments_controller_test.rb
describe Api::V2::CommentsController
it "does something" do
get :index
end
end
Run Code Online (Sandbox Code Playgroud)
在Rails 3中,上述方法可行.但在Rails 4中,我收到了URL生成错误:
ActionController :: UrlGenerationError:没有路由匹配{:action =>"index",:controller =>"api/v2/comments"}
从这里我可以推断,get当试图找到控制器和动作时,帮助器根本无法匹配路由文件中的路由.很公平.我可以通过更改get调用来解决这个问题,以包含满足嵌套路由所需的参数,如下所示:
# test/controllers/api/v2/comments_controller_test.rb
describe Api::V2::CommentsController
it "does something" do
get :index, { user_id: "1", post_id: "1" }
end
end …Run Code Online (Sandbox Code Playgroud)