2015-11-24 21 views
6

私は奇妙な状況があります。 私はroutes.rbを、そのようなコードを持っている:Rpsec「経路が一致しません」

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 

だから、それは私が 'ポスト' を介してvote_up_questionvote_up_answerをヘルパー与える:

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 

マイvotes_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 

すべてを完璧に動作しますが、しかし!

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

間違っているもの:

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 

そして、ここで問題です: 私はRSpecの持つload_parent方法があることをテストしたいですか?私はまたpost :vote_up, question_id: questionのように、明確なルートを作るためにさまざまな方法を試してみましたが、それは動作しません

+1

? –

+0

その一部を質問に追加しました。 –

+2

あなたは 'post:vote_up、id:question.id'を試しましたか? –

答えて

0

試してみてください。それはそれはかもしれない、このブロックで呼び出されていないので、もし

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

レットは怠け者評価され定義されていない。

は、その後の操作を行います。

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 

終わり、あなたが ``すくいroutes``出力を示すことができ

関連する問題