Rails4 Rspec控制器测试没有路由匹配

时间:2017-08-10 11:36:46

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

全部。我是Ruby on Rails的初学者。有一个错误,我一直在努力,但无法解决。

我试图查看messages_controller.rb中声明的变量@chat_group是否匹配message_controller_spec.rb中声明的另一个变量。我没有任何线索来解决这个错误,因为我100%肯定我正在给出我应该给予的参数,就像路线所说的那样是chat_group_id。

有没有人有任何洞察力来解决这个问题? 或者之前有人遇到过类似的问题吗?

如果您有或有,请您解决此问题? 任何意见,将不胜感激!谢谢你的支持!

1) MessagesController#GET index when the user logs in Checking if the variable in index action matches
 Failure/Error: get :index, params: index_params
 ActionController::UrlGenerationError:
   No route matches {:action=>"index", :controller=>"messages", :params=>{:chat_group_id=>"522"}}
 # ./spec/controllers/messages_controller_spec.rb:13:in `block (4 levels) in <top (required)>'

messages_controller_spec.rb

RSpec.describe MessagesController, type: :controller do
  let(:chat_group)    { create(:chat_group) }
  let(:message)       { create(:message) }
  let(:index_params)  { { chat_group_id: chat_group } }

  describe '#GET index' do
    context 'when the user logs in' do
      login_user
      it 'Checking if the variable in index action matches' do
        get :index, params: index_params
        expect(assigns(:chat_group)).to eq chat_group
      end
    end
  end
end

Route.rb

   chat_group_messages GET    /chat_groups/:chat_group_id/messages(.:format) messages#index
                     POST   /chat_groups/:chat_group_id/messages(.:format) messages#create
         chat_groups GET    /chat_groups(.:format)                         chat_groups#index
                     POST   /chat_groups(.:format)                         chat_groups#create
      new_chat_group GET    /chat_groups/new(.:format)                     chat_groups#new
     edit_chat_group GET    /chat_groups/:id/edit(.:format)                chat_groups#edit
          chat_group PATCH  /chat_groups/:id(.:format)                     chat_groups#update
                     PUT    /chat_groups/:id(.:format)                     chat_groups#update

MessageController.rb

class MessagesController < ApplicationController
  before_action :set_chat_group

  def index
   @chat_groups = current_user.chat_groups
   @messages = @chat_group.messages
   @message = Message.new

   respond_to do |format|
      format.html { render :index }
      format.json { render json: 
       @chat_group.messages.includes(:user).map{|x| x.json_api} }
     end
   end

  private
  def set_chat_group
    @chat_group = ChatGroup.find(params[:chat_group_id])
  end
end

更新

我解决了错误!我在下面的评论中提出了解决问题的方法!

2 个答案:

答案 0 :(得分:0)

尝试将type: controller更改为type: request

您也可以使用request type并指定路径:

get chat_group_messages_path(chat_group.id), index_params

干杯

答案 1 :(得分:0)

我认为你做的一切都是正确的。

但是这一行:expect(assigns(:group)).to eq group

您期望assigns(:group)但我在您正在测试的索引操作中看不到任何名为group的变量。

您也希望它与“eq group”组相同,但在上例中的let块中,不存在名为group的变量。

所以尽量做expect(assigns(:chat_groups)).to eq chat_group

assigns(:chat_groups)在您的操作中使用与实例变量相同的名称,而eq chat_group使用let块中的变量名称