2017-02-08 6 views
1

Ich habe es mit einem scheinbar seltsamen Problem zu tun, während ich versucht habe Unit Tests auf einem verschachtelten resources Controller auszuführen. Hier ist mein Setup:RSpec kann keine Route für verschachtelte Ressourcen finden

routes.rb:

Rails.application.routes.draw do 
    scope module: 'api' do 
    namespace :v1 do 
     resources :users do 
     resources 'item-configurations', 
      controller: :item_configuration, 
      as: :item_configurations, 
      on: :member 
     end 
    end 
    end 
end 

app/controllers/api/v1/item_configurations_controller.rb:

module Api::V1        
    class ItemConfigurationsController < ApplicationController 
    def show 
     @user = authorize User.find(params[:user_id])  
     @item_configuration = authorize @user.item_configurations.find(params[:id]) 

     success @item_configuration 
    end 
    end 
end 

und schließlich spec/controllers/api/v1/item_configurations_controller_spec.rb:

require 'rails_helper' 

describe Api::V1::ItemConfigurationsController do 
    describe '#show' do 
    it 'renders an item configuration' do 
     user = FactoryGirl.create(:user) 
     configuration = FactoryGirl.create(:item_configuration) 

     get :show, params: {user_id: user.id, id: configuration.id} 
     expect(response.status).to equal(200) 
    end 
    end 
end 

Wenn ich eine Anfrage an /users/1/item-configurations/4 mache ich bin in der Lage zu bekomme eine Antwort, genau wie ich es erwarte. Das Problem kommt aus, wenn ich rspec laufen, ich folgende Fehlermeldung erhalten:

1) Api::V1::ItemConfigurationsController#show renders an item configuration 
    Failure/Error: get :show, params: {user_id: user.id, id: configuration.id} 

    ActionController::UrlGenerationError: 
     No route matches {:action=>"show", :controller=>"api/v1/item_configurations", :id=>1, :user_id=>1} 

Normalerweise treten diese Fehler, wenn ein Parameter aus der Anfrage nicht vorhanden, aber in diesem Fall scheint alles, was es zu sein (beide user_id und id) . Ich habe auch das auf anderen Routen auf dem Controller versucht (#index funktioniert auch, wenn eine GET gesendet, aber funktioniert nicht in Rspec), Hinzufügen eines format: :json Param, etc., aber nichts scheint es zu lösen.

Bin ich verrückt oder gibt es etwas einfaches hier fehlt mir?

+0

Für mich sieht es ähnlich wie [das] (https://github.com/ rspec/rspec-rails/issues/1586) Problem. Ich weiß nicht, ob es hilft oder nicht. Ich würde auch versuchen, 'Rails.application.routes.draw' in' Yourappname :: Application.routes.draw' umzubenennen. – mutantkeyboard

+0

Fehle ich etwas oder ist rspec in der Fehlerausgabe auf 'TrayConfigurationsController' zurückzuführen, aber du beschreibst' ItemConfigurationsController' . Irgendwas seltsam in 'log/test.log'? – Anthony

+0

hoppla, das ist ein Fehler. Ich habe einige Modelle für diese Frage umbenannt, um sie allgemeiner zu machen. Ich habe das in der letzten Bearbeitung behoben. –

Antwort

2

Nun, abgesehen von der Typo controller: :item_configuration in Ihren Routen (Singular, während Controller Plural ist) geben Sie on Parameter auf resources. Es scheint so zu sein, dass es sich eher um eine Beschränkung auf resources handelt als um einen "Typ" der Interaktion.

Von Konsole:

app.url_for({:action=>"show", :controller=>"api/v1/item_configurations", :id=>"2", :user_id=>"1"}) 
=> ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"api/v1/item_configurations", :id=>"2", :user_id=>"1"} 
app.url_for({:action=>"show", :controller=>"api/v1/item_configurations", :id=>"2", :user_id=>"1", on: :member}) 
=> "http://www.example.com/v1/users/1/item_configurations/2" 

Deshalb verwenden member Block in Routen gewünschtes Verhalten zu erreichen:

... 
resources :users do 
    member do 
    resources :configuration_items 
    end 
end 
... 
+0

JA, das war es! Vielen Dank, du hast mir mehr Zeit/Verstand erspart, als du weißt, haha. –

Verwandte Themen