2014-10-09 4 views
0

Я новичок в Ruby, и мне нужно написать тесты для Rails-приложения.Маршруты вызова участников в ActionController :: TestCase

Моя проблема заключается в том, что я не знаю, как я могу вызвать accept действие FriendshipsController

Вот это FriendshipsController:

class FriendshipsController < ApplicationSocialController 
    # ... 

    # create method is getting called 
    def create 
    # accessing params[:user_id] 
    end 

    # accept method doesn't get called 
    def accept 
    # accessing params[:id] and params[:user_id] 
    end 
end 

В следующем тестовом коде я увидел, что FriendshipsController.create метод называется:

current_user = users(:users_002) 
friend_user = users(:users_003) 
@request.session[:user_id] = current_user.id 
post :create, :user_id => friend_user.id # works fine 

Но как я могу l FriendshipsController.accept метод?

current_user = users(:users_002) 
friend_user = users(:users_003) 
friendship_from_current_to_friend = create_friendship(current_user, friend_user) 
# friend_user should can accept friendship request 
@request.session[:user_id] = friend_user.id 
put :accept, :user_id => current_user.id, :id => friendship_from_current_to_friend.id 

put вызова работает без исключения, но accept из FriendshipsController никогда не вызывается.

Вот routes.rb

RedmineApp::Application.routes.draw do 
    # ... 
    resources :users do 
    # ... 
    resources :friendships do 
     # ... 
     member do 
     put :accept 
     put :deny 
     end 
    end 
    end 
    # ... 
end 

Что такое правильный способ вызова accept?

Редактировать

Вот за исключением маршрутов

 
GET /users/:user_id/friendships/accepted(.:format)  friendships#accepted 
GET /users/:user_id/friendships/pending(.:format)  friendships#pending 
GET /users/:user_id/friendships/denied(.:format)   friendships#denied 
GET /users/:user_id/friendships/write_message(.:format) friendships#write_message 
PUT /users/:user_id/friendships/:id/accept(.:format)  friendships#accept 
PUT /users/:user_id/friendships/:id/deny(.:format)  friendships#deny 
GET /users/:user_id/friendships(.:format)    friendships#index 
POST /users/:user_id/friendships(.:format)    friendships#create 
GET /users/:user_id/friendships/new(.:format)   friendships#new 
GET /users/:user_id/friendships/:id/edit(.:format)  friendships#edit 
GET /users/:user_id/friendships/:id(.:format)   friendships#show 
PUT /users/:user_id/friendships/:id(.:format)   friendships#update 
DELETE /users/:user_id/friendships/:id(.:format)   friendships#destroy 
+0

Как вы проверяете, что он вызывается?Вызов выглядит отлично. – max

+0

@papirtiger Я положил '$ stderr.puts 'create'' и' $ stderr.puts' accept'' поверх методов контроллера. После этого я вижу его на консоли, какой метод вызывается. – Vertex

ответ

0

Я нашел проблему: Каждый запрос дружбы состоит из двух соответствующих дружбы объектов

В любом

  • право пользователя , я. е. friend_user, принимает неправильную дружбу id или
  • неправильный пользователь, i. е. current_user, принимает правильно ДРУЖБА ID

метод accept будет не Первозванного.

Итак, если правильный пользователь принимает правильный идентификатор дружбы, метод accept будет называться штрафом. Но это не разъясняет, почему метод accept не вызван с неправильным вводом.

1

Попробуйте использовать $ rake routes

  Prefix Verb URI Pattern      Controller#Action 
     friendships GET /friendships(.:format)   friendships#index 
        POST /friendships(.:format)   friendships#create 
    new_friendship GET /friendships/new(.:format)  friendships#new 
    edit_friendship GET /friendships/:id/edit(.:format) friendships#edit 
     friendship GET /friendships/:id(.:format)  friendships#show 
        PATCH /friendships/:id(.:format)  friendships#update 
        PUT /friendships/:id(.:format)  friendships#update 
        DELETE /friendships/:id(.:format)  friendships#destroy 
accept_friendship PUT /friendships/:id/accept(.:format) friendships#accept 
    deny_friendship PUT /friendships/:id/deny(.:format) friendships#deny 
        GET /friendships(.:format)   friendships#index 
        POST /friendships(.:format)   friendships#create 
        GET /friendships/new(.:format)  friendships#new 
        GET /friendships/:id/edit(.:format) friendships#edit 
        GET /friendships/:id(.:format)  friendships#show 
        PATCH /friendships/:id(.:format)  friendships#update 
        PUT /friendships/:id(.:format)  friendships#update 
        DELETE /friendships/:id(.:format)  friendships#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 
        PATCH /users/:id(.:format)    users#update 
        PUT /users/:id(.:format)    users#update 
        DELETE /users/:id(.:format)    users#destroy 

Выход говорит нам, что accept_friendship не принимает user_id параметров.

put :accept, :id => friendship_from_current_to_friend.id 
+0

Спасибо! Я запускаю «rake routes», и я получаю пустой список. Но с помощью 'Rails.application.routes.routes.to_a' я смог запрограммировать эти маршруты. См. Мое редактирование. Я думаю, что ': user_id' требуется, иначе я получаю« Нет маршрутов »{: user_id =>« 2 »,: controller =>« friendships »,: action =>« accept »}' – Vertex

+0

Можете ли вы добавить все свое 'routes.rb'? В вашем вопросе ': friendships' не вложены под': users'. – max

+0

О, извините, это была моя ошибка. Отредактированные маршруты.db – Vertex

Смежные вопросы