这是我的路线的样子:
/article/:id/:action {:root=>"article", :controller=>"article/article", :title=>"Article"}
这是我的 Controller 的样子:
# app/controllers/article/article_controller.rb
class ArticleController < ApplicationController
def save_tags
# code here
end
end
我想测试 save_tags 操作,所以我这样写我的规范:
describe ArticleController do
context 'saving tags' do
post :save_tags, tag_id => 123, article_id => 1234
# tests here
end
end
但是当我运行这个规范时,我得到了错误
ActionController::RoutingError ...
No route matches {:controller=>"article/article", :action=>"save_tags"}
我认为问题是 save_tags Action 是一个通用的 Controller Action ,即。路由中没有/article/:id/save_tags 。测试此 Controller 操作的最佳方法是什么?
最佳答案
你很准。问题是您正在寻找一条没有 :id
的路线。在里面,但你没有。您需要将参数传递给 post :save_tags
的 :id
,鉴于上述问题,我相信这就是您所说的article_id
.
因此,尝试将您的测试更改为:
describe ArticleController do
context 'saving tags' do
post :save_tags, tag_id => 123, id => 1234
# tests here
end
end
更新
Rails 可能会因为您使用
:action
而感到困惑在你的路线上,我相信 action
要么是保留字,要么是 Rails 认为特殊的字。也许尝试将您的路线更改为:/article/:id/:method_name {:root=>"article", :controller=>"article/article", :title=>"Article"}
你的测试:
describe ArticleController do
context 'saving tags' do
post :save_tags, { :tag_id => 123, :article_id => 1234, :method_name => "save_tags" }
# tests here
end
end
关于ruby-on-rails - 使用 rspec 测试通用 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20129270/