2015-11-24 2 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_question и vote_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 

Everything отлично работает, НО! Я хочу, чтобы проверить, что load_parent метод с 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 

А вот проблема:

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

Что не так? Я также пробовал различные способы, чтобы сделать четкий маршрут, как post :vote_up, question_id: question, но он не работает

+1

Не могли бы вы показать '' выход routes'' грабли? –

+0

Добавлена ​​часть этого вопроса. –

+2

Вы пробовали 'сообщение: vote_up, id: question.id'? –

ответ

0

Try:

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 

конец

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