2012-07-20 11 views
8

Utworzono silnik szyny w the normal fashion, zainstalowałem RSpec i wygenerowałem rusztowanie dla modelu, ale nie mogę uzyskać specyfikacji routingu do przekazania.Wszystkie przykłady routingu są nieskuteczne dla mechanizmu Rails 3.2 z RSpec 2.10

Oto jeden z przykładów:

describe Licensing::LicensesController do 
    it 'routes to #index' do 
    get('/licensing/licenses').should route_to('licensing/licenses#index') 
    end 
end 

biegnę przykłady w manekina aplikacji tak:

$ cd spec/dummy 
$ rake spec 
/Users/brandan/.rvm/rubies/ruby-1.9.3-p194/bin/ruby -S rspec ../routing/licensing/licenses_routing_spec.rb 
F 

Failures: 

    1) Licensing::LicensesController routes to #index 
    Failure/Error: get('/licensing/licenses').should route_to('licensing/licenses#index') 
     No route matches "/licensing/licenses" 
    # /Users/brandan/repos/licensing/spec/routing/licensing/licenses_routing_spec.rb:5:in `block (2 levels) in <top (required)>' 

Finished in 0.04345 seconds 
1 example, 1 failure 

Silnik jest zamontowany prawidłowo w manekina aplikacji:

# spec/dummy/config/routes.rb 
Rails.application.routes.draw do 
    mount Licensing::Engine => "/licensing" 
end 

Mogę wejść do atrapa i odpalić konsolę, aby uzyskać tę trasę:

1.9.3p194 :001 > app.get('/licensing/licenses') 
    Licensing::License Load (0.3ms) SELECT "licensing_licenses".* FROM "licensing_licenses" 
200 
1.9.3p194 :002 > app.response.body 
"<!DOCTYPE html>..." 

Istnieje pewna rozbieżność między aplikacją fikcyjną a RSpec i nie wiem, co to jest. Znalazłem kilka artykułów, które twierdzą, aby rozwiązać ten problem, ale żaden z nich nie pomógł, a kilka z nich są specyficzne dla Rails 3.1:

Czy ktoś rozwiązał ten problem w Rails 3.2/RSpec 2.10?

+0

Ja zakładając, że testujemy na manekina aplikacji, która integruje silnik. Czy jesteś pewien, że silnik jest zamontowany na trasach fałszywej aplikacji? Jeśli tak, czy jesteś pewien, że twoja specyfikacja jest typu ': type =>: routing'? –

+0

@TanzeebKhalili Jestem pewien, że trasy są poprawne, ponieważ działają w konsoli i przeglądarce. Używam specyfikacji z poziomu fałszywej aplikacji. Pliki znajdują się w 'spec/routing', a jawne określanie': type =>: routing' nie powoduje, że przykłady również są przekazywane. Więcej pomysłów? : -/ – Brandan

+1

Co do następujących zmian: 1) Inny opisany obiekt: "opisz" trasy "do ..." i 2) Inna składnia: '{: get => '/ licensing/licenses'} .should be_routable' –

Odpowiedz

10

Update (2013- 10-31)

RSpec 2.14 teraz fully supports engine routes:

module MyEngine 
    describe ExampleController do 
    routes { MyEngine::Engine.routes } 
    end 
end 

Dodaj go do wszystkich specyfikacji routingu:

# spec/spec_helper.rb 
config.include Module.new { 
    def self.included(base) 
    base.routes { Reportr::Engine.routes } 
    end 
}, type: :routing 

Najlepszym rozwiązaniem udało mi się znaleźć tak daleko jest wyraźnie ustalone wyznaczonej trasy, która będzie używana podczas testów:

RSpec.configure do |config| 
    config.before(:each, type: :controller) { @routes = Licensing::Engine.routes } 
    config.before(:each, type: :routing) { @routes = Licensing::Engine.routes } 
end 

Potem musiałem przerobić moje przykłady routingu pominięcie nazw:

it 'routes to #index' do 
    get('/licenses').should route_to('licensing/licenses#index') 
end 

To wydaje się trochę hackować, ale ma sens.Nie testuję, czy Rails jest w stanie zamontować silnik na określonej ścieżce. Testuję tylko, czy mój silnik poprawnie skonfigurował własne trasy. Mimo to wolałbym nie zastępować zmiennej instancji, aby to się stało.

Oto jeszcze kilka dobrych wątków na ten temat:

+0

Drugie łącze rozwiązało problem dla mnie. Dziękuję bardzo! –

+0

To rozwiązanie przestało działać w wersji rspec 2.14! –

+0

tak, i jest trasy {Licencjonowanie :: Silnik.routes} , aby go zastąpić: możesz dodać to do specyfikacji, ale po prostu muszę znaleźć rozwiązanie, aby dodać to do __all__ specyfikacji kontrolera silnika ... – mugwump

7

Myślę, że musisz jawnie poinformować RSpec, że używasz trasy Railsów o nazwach. EG,

# :use_route => ENGINE_NAMESPACE 
:use_route => 'licensing' 

Dodatkowo, dlaczego nie ułatwić pisanie testów kontrolerów rspec jak to,

describe Licensing::LicensesController do 
    it 'GET index' do 
    get :index, use_route: 'licensing' 
    end 
end 

Oto link do sterowników rspec ja, https://github.com/westonplatter/questionnaire_engine/tree/engine/spec/controllers

+0

Dziękuję za odpowiedź, ale moje pytanie jest w szczególności o testach routingu - tzn. chcę jawnie przetestować trasy '/ licence/licenses' do poprawnego kontrolera i akcji, nie tylko, że mogę' dostać: index' na danym kontrolerze. Myślę, że znalazłem rozwiązanie, chociaż nie jest ładne. – Brandan

Powiązane problemy