Rpsec "no route matches"

I have a strange situation. I have this code on my .rb routes:

concern :votable do post :vote_up, on: :member, controller: :votes post :vote_down, on: :member, controller: :votes end resources :questions, concerns: [:commentable, :votable], shallow: true do resources :answers, concerns: [:commentable, :votable] end 

So it gives me helpers vote_up_question and vote_up_answer via 'post':

 vote_up_answer POST /answers/:id/vote_up(.:format) votes#vote_up vote_down_answer POST /answers/:id/vote_down(.:format) votes#vote_down vote_up_question POST /questions/:id/vote_up(.:format) votes#vote_up vote_down_question POST /questions/:id/vote_down(.:format) votes#vote_down 

My voice_controller:

  before_action :load_parent def vote_up current_user.vote_for(@parent) redirect_to :back, notice: "Voted up" end private def load_parent resource, id = request.path.split("/")[1, 2] @parent = resource.singularize.classify.constantize.find(id) end 

Everything works fine, BUT! I want to verify that the load_parent method with RSpec:

 RSpec.describe VotesController, type: :controller do let(:question) {create(:question)} let(:answer) {create(:answer, user_id: user, question_id: question)} let(:user) {create(:user)} before(:each) do |example| sign_in user if example.metadata[:sign_in] request.env["HTTP_REFERER"] = question_path(question) if example.metadata[:redirect_back] end describe 'POST #vote_up', sign_in: true, redirect_back: true do it 'should assign question to @parent' do post vote_up_question_path(question) expect(assigns(:parent)).to eq 'question' end end end 

And here is the problem:

 ActionController::UrlGenerationError: No route matches {:action=>"/questions/1/vote_up", :controller=>"votes"} 

What's wrong? I also tried different ways to make a clear route, like post :vote_up, question_id: question , but it does not work.

+6
source share
1 answer

Try:

  let!(:question) {create(:question)} let!(:user) {create(:user)} let!(:answer) {create(:answer, user_id: user, question_id: question)} 

let lazy be evaluated, so if it is not called in this block, it can be undefined.

Then do:

  describe 'POST #vote_up', sign_in: true, redirect_back: true do it 'should assign question to @parent' do post :vote_up, id: question.id expect(assigns(:parent)).to eq 'question' end 

end

0
source

All Articles