我正在将Rails应用程序从3.2升级到4.0.4,我对3.2版本上完美运行的控制器进行了一些测试,现在由于无路由匹配错误而失败。我想知道在测试我的控制器时需要做什么路线。
我有一个这样的嵌套路线:
resources :projects, only: [:index, :show, :create, :edit], shallow: true do
resources :tasks, only: [:create, :index, :show, :edit, :update]
end
在我的任务控制器规范中,我有这个,并且在更新后失败,正在使用rails 3.2:
rspec的
describe 'with no project/id parameter' do
it 'json code is assigned to invalid parameters' do
params = valid_params
params.delete(:project_id)
post :create params
expect(assigns(:json_code)).to eq(INVALID_PARAMS)
end
end
然而,升级后失败,这是消息:
ActionController::UrlGenerationError:
No route matches {:action=>"create", :controller=>"tasks", :format=>"json"}
因此,在之前的版本中似乎未对路线进行评估。我知道这几乎不会发生在一个真实的场景中,但是如果我意外地错过了一个到该动作的路径,那么可能在没有project_id参数的情况下调用该动作。
那么解决方案或编写此测试的正确方法是什么?
答案 0 :(得分:0)
运行rake routes
,您会看到create
的路由带有POST
HTTP动词。
在您的示例中,您将create
作为get
请求进行调用,没有类似的路由。所以你得到的错误为No route matches {:action=>"create", :controller=>"tasks", :format=>"json"}
只需更改您的示例,如下所示:
describe 'with no project/id parameter' do
it 'json code is assigned to invalid parameters' do
params = valid_params
params.delete(:project_id)
post :create params ## post request
expect(assigns(:json_code)).to eq(INVALID_PARAMS)
end
end
如果我不小心错过了一个到那个动作的路线就有可能了 在没有project_id参数的情况下调用action。
您正在从params散列中删除:project_id
,因此您将始终收到错误,因为没有路由匹配。 create
路由需要传递project_id
,如果未通过,则您将没有匹配的路由,并且永远不会调用create
操作。