带有轨道4的Rspec测试控制器在更新路由后失败

时间:2014-04-24 16:48:25

标签: ruby-on-rails ruby rspec

我正在将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参数的情况下调用该动作。

那么解决方案或编写此测试的正确方法是什么?

1 个答案:

答案 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操作。