2016-08-22 2 views
0

Ich habe Routen eingerichtet, so dass sie wie erwartet in meinen Controllern funktionieren; Ich kann room_path und rooms_path wie erwartet verwenden.Kontrollspezifikation ActionController :: UrlGenerationError

aber wenn ich versuche, aus irgendeinem Grunde die gleichen Strecken in einer Controller-Spezifikation zu verwenden, dann bekomme ich einen Fehler:

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

Meine routes.rb Datei:

root "rooms#index" 
    resources :rooms, :path => '/', only: [:index, :create, :show] do 
    resources :connections, only: [:create,:destroy] 
    end 

Und wenn ich Rake Routen:

room_connections POST /:room_id/connections(.:format)  connections#create 
room_connection DELETE /:room_id/connections/:id(.:format) connections#destroy 
rooms GET /   rooms#index 
     POST /   rooms#create 
room GET /:id(.:format) rooms#show 

aber mein Test nicht bestanden:

describe "GET room_path(room)" do 
    it "renders show" do 
     @room = Room.create 
     get room_path(@room) 
     expect(response.status).to eq(200) 
     expect(response).to render_template(:show) 
    end 
end 

Während meine Controller die gleiche Strecke Helfer ohne Probleme verwenden können:

class RoomsController < ApplicationController 
    def index 
    end 

    def create 
    @room = Room.create 
    redirect_to room_path(@room) 
    end 

    def show 
    @room = Room.find(params[:id]) 
    end 
end 

Ich bin mir nicht sicher, warum in meinen Tests es eher für eine „/ 1“ -Aktion der Suche zu gehen scheint als # show Zimmer wie ich es erwarten würde.

aktualisieren

So weiterhin diese spielen ich habe in der Lage, indem auf die folgende den Test grün zu erhalten:

describe "GET room_path(room)" do 
    it "renders show" do 
     @room = Room.create 
     get :show, params: { id: @room.id } 
     expect(response.status).to eq(200) 
     expect(response).to render_template(:show) 
    end 
end 

Ich würde noch warum meine Helfer zu verstehen, lieben funktionieren aber nicht. Ist das zu erwarten? Manuelles Schreiben des Parameters Hash ist eine Art PITA.

Antwort

0

Ich weiß nicht, welche Version von Rails und RSpec Sie sind. Dies funktioniert für mich auf Rails 4.2 und Rspec 3.4.4:

describe "my neat test description", type: :routing do 
    it "can use path helper" do 
    puts whatever_path 
    end 
end 

Die type: :routing zieht in den Weg und URL Helfer.

Ich glaube, der Grund, warum Sie das nicht standardmäßig haben, ist, dass RSPEC viel Umgebung für die verschiedenen Arten von Tests repliziert. Für Controller-Tests zieht es die verschiedenen Pfad- und URL-Helfer ein, weil sie dort im Allgemeinen oft genug eingesetzt werden, um sich einzuziehen. In Modelltests werden sie beispielsweise dort oft nicht verwendet, so dass sie nicht eingezogen werden standardmäßig.

Diese Helfer leben auf dem App-Objekt.

Verwandte Themen