Подтвердить что ты не робот

Тесты говорят, что нет маршрутов, но они работают в браузере

Для моего теста у меня есть следующее:

test "should update holder" do
        holder = Holder.create(name: "name", user_id: 10)
        put :update, holder: holder
    assert_redirected_to holder_path(assigns(:holder))
end

И когда я запускаю их, я получаю следующую ошибку:

  ERROR (0:00:00.185) test_should_update_holder
  No route matches {:holder=>"980190963", :controller=>"holders", :action=>"update"}
        @ /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:532:in `raise_routing_error'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:528:in `rescue in generate'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:520:in `generate'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:561:in `generate'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:557:in `generate_extras'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/routing/route_set.rb:553:in `extra_keys'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_controller/test_case.rb:147:in `assign_parameters'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_controller/test_case.rb:453:in `process'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_controller/test_case.rb:49:in `process'
          /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_controller/test_case.rb:390:in `put'
          test/functional/holders_controller_test.rb:36:in `block in <class:HoldersControllerTest>'
          /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.2.3/lib/active_support/testing/setup_and_teardown.rb:35:in `block in run'
          /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:458:in `_run__4148286245602197272__setup__4285546581512185515__callbacks'
          /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:405:in `__run_callback'
          /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:385:in `_run_setup_callbacks'
          /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:81:in `run_callbacks'
          /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.2.3/lib/active_support/testing/setup_and_teardown.rb:34:in `run'

Но на моих маршрутах я:

Teacherjoy::Application.routes.draw do
  get "users/new"

  resources :questions
  resources :pages
  resources :holders
  resources :users
  resources :sessions, only: [:new, :create, :destroy]
  root :to => 'pages#home'

  match '/signup',  to: 'users#new'
  match '/signin',  to: 'sessions#new'
  match '/signout', to: 'sessions#destroy', via: :delete
end

и возвращаются маршруты рейка:

[teacherjoy (master)]$ rake routes
    users_new GET    /users/new(.:format)          users#new
    questions GET    /questions(.:format)          questions#index
              POST   /questions(.:format)          questions#create
 new_question GET    /info/new(.:format)      questions#new
edit_question GET    /info/:id/edit(.:format) questions#edit
     question GET    /info/:id(.:format)      questions#show
              PUT    /info/:id(.:format)      questions#update
              DELETE /info/:id(.:format)      questions#destroy
        pages GET    /pages(.:format)              pages#index
              POST   /pages(.:format)              pages#create
     new_page GET    /pages/new(.:format)          pages#new
    edit_page GET    /pages/:id/edit(.:format)     pages#edit
         page GET    /pages/:id(.:format)          pages#show
              PUT    /pages/:id(.:format)          pages#update
              DELETE /pages/:id(.:format)          pages#destroy
      holders GET    /holders(.:format)            holders#index
              POST   /holders(.:format)            holders#create
   new_holder GET    /holders/new(.:format)        holders#new
  edit_holder GET    /holders/:id/edit(.:format)   holders#edit
       holder GET    /holders/:id(.:format)        holders#show
              PUT    /holders/:id(.:format)        holders#update
              DELETE /holders/:id(.:format)        holders#destroy
        users GET    /users(.:format)              users#index
              POST   /users(.:format)              users#create
     new_user GET    /users/new(.:format)          users#new
    edit_user GET    /users/:id/edit(.:format)     users#edit
         user GET    /users/:id(.:format)          users#show
              PUT    /users/:id(.:format)          users#update
              DELETE /users/:id(.:format)          users#destroy
     sessions POST   /sessions(.:format)           sessions#create
  new_session GET    /sessions/new(.:format)       sessions#new
      session DELETE /sessions/:id(.:format)       sessions#destroy
         root        /                             pages#home
       signup        /signup(.:format)             users#new
       signin        /signin(.:format)             sessions#new
      signout DELETE /signout(.:format)            sessions#destroy

Если вы посмотрите на маршруты рейка, очевидно, что это действие для обновления, которое является помещением в контроллере держателей, что и делает мой тест, правильно?

4b9b3361

Ответ 1

Обратите внимание, что маршрут фактически PUT /holders/:id, но вы передаете :holder параметр put, а не :id. Попробуйте изменить эту строку в своем тесте на следующее:

put :update, id: holder