【问题标题】:How can I drive a controller spec for a nested route's new method?如何为嵌套路由新方法驱动控制器规范?
【发布时间】:2014-08-01 15:48:49
【问题描述】:

我有一个相当简单的路线设置:

  resources :users, only: [:show] do
    resources :account_groups

生成这些路由:

$rake routes CONTROLLER=api/account_groups
    api_user_account_groups GET    /api/users/:user_id/account_groups(.:format)          api/account_groups#index
                            POST   /api/users/:user_id/account_groups(.:format)          api/account_groups#create
 new_api_user_account_group GET    /api/users/:user_id/account_groups/new(.:format)      api/account_groups#new
edit_api_user_account_group GET    /api/users/:user_id/account_groups/:id/edit(.:format) api/account_groups#edit
     api_user_account_group GET    /api/users/:user_id/account_groups/:id(.:format)      api/account_groups#show
                            PUT    /api/users/:user_id/account_groups/:id(.:format)      api/account_groups#update
                            DELETE /api/users/:user_id/account_groups/:id(.:format)      api/account_groups#destroy

当我尝试为controller#new 编写规范时,问题就来了:

describe '#new' do
  it 'responds 200' do
    get :new
    response.status.should eq 200
  end
end

失败是因为路由需要你指定:user_id:

1) Api::AccountGroupsController#new responds 200
     Failure/Error: get :new
     ActionController::RoutingError:
       No route matches {:controller=>"api/account_groups", :action=>"new"}

但是,当我指定 :user_id:

describe '#new' do
  it 'responds 200' do
    get :new, {user_id: user.id}
    response.status.should eq 200
  end
end

它抱怨我添加了一个意外的参数:

1) Api::AccountGroupsController#new responds 200
     Failure/Error: get :new, {user_id: user.id}
     ArgumentError:
       wrong number of arguments (1 for 0)

知道如何进行这项工作吗?谢谢!

【问题讨论】:

  • 您的规范中在哪里定义了user
  • user 在顶层定义,因为它被所有规范共享。如果user 未定义,您将得到NameError 而不是ArgumentError
  • 我想知道它是如何定义的,而不是在哪里定义的。 :) 你有没有得到任何堆栈跟踪?
  • 你的测试班叫什么名字?
  • class Api::AccountGroupsControllerdescribe Api::AccountGroupsController do

标签: ruby-on-rails ruby rspec ruby-on-rails-3.2


【解决方案1】:

你的测试类的名字应该是:

Api::Users::AccountGroupsControllerTest

【讨论】:

  • 这只是抛出一个UninitializedConstant 错误。我也尝试重命名控制器,但不喜欢。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多