2012-07-20 2 views
8

the normal fashion에 Rails 엔진을 만들고 RSpec을 설치했으며 모델에 대한 스캐 폴드를 생성했지만 라우팅 사양을 전달할 수 없습니다.모든 라우팅 예제가 RSpec 2.10이 설치된 Rails 3.2 엔진에서는 실패합니다.

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

이 같은 더미 응용 프로그램의 예제를 실행 해요 :

$ 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 

엔진은 더미 응용 프로그램에 올바르게 장착 :

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

여기에 하나의 예입니다

그리고 나는 더미 응용 프로그램에 들어가서 콘솔을 작동시켜 그 경로를 올바르게 얻을 수 있습니다 :

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>..." 

더미 응용 프로그램과 RSpec간에 약간의 차이가 있으며 그게 무엇인지 알 수 없습니다. 나는이 문제를 해결하기 위해 주장 몇 가지 기사를 발견했지만, 그들 중 누구도 도왔으며, 그들 중 일부는 레일에 특정 3.1 :

레일리스 3.2/RSpec 2.10에서이 문제를 해결 한 사람이 있습니까?

+0

나는 당신이 당신의 엔진을 통합하는 더미 응용 프로그램에 대해 테스트하고 있으리라 믿고있어 : 여기

는이 주제에 대한 좋은 스레드의 또 다른 부부. 엔진이 더미 응용 프로그램의 경로에 마운트되어 있습니까? 만약 그렇다면, 당신의 스펙은': type => : routing'입니까? –

+0

@ TanzeebKhalili 나는 콘솔과 브라우저에서 작동하기 때문에 라우트가 정확하다고 확신한다. 난 더미 애플 리케이션 내에서 사양을 실행 중입니다. 파일은'spec/routing'에 있고': type => : routing'을 명시 적으로 지정해도 예제가 통과되지 않습니다. 더 이상 아이디어가 없습니까? :/ – Brandan

+1

다음과 같이 변경하는 방법 : 1) 설명 된 다른 객체 : 경로 "do ..."및 2) 다른 구문 : '{: get =>'/ licensing/licenses '}. beouldro_routable' –

답변

10

업데이트를 같은 RSpec에 컨트롤러 테스트의을 writting을 단순화하지 10-31)

RSpec 2.14 now fully supports engine routes :

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

모든 라우팅 사양에 추가

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

내가 지금까지 명시 적으로 테스트시 사용되는 경로 설정을 설정하는 것입니다 그래서 찾을 수있었습니다 가장 좋은 해결책 :

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

은 그럼 네임 스페이스를 생략 할 내 라우팅 예제를 다시 작성했다 :

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

이것은 약간 해킹처럼 보이지만 이해가됩니다.Rails가 특정 경로에 엔진을 탑재 할 수 있는지 여부는 테스트하지 않습니다. 엔진이 자체 경로를 올바르게 설정했는지 테스트하고 있습니다. 여전히 인스턴스 변수를 덮어 쓰지 않아도된다.

+0

두 번째 링크는 나를 위해 문제를 해결했습니다. 매우 감사합니다! –

+0

이 솔루션은 rspec 2.14에서 작동을 멈췄습니다! –

+0

예, 여기에 경로 {Licensing :: Engine.routes} 이 있습니다.이를 사양에 추가 할 수 있지만이를 엔진의 __all__ 컨트롤러 사양에 추가하는 솔루션을 찾아야합니다. ... – mugwump

7

RSpec에 네임 스페이스가 지정된 레일스 경로를 사용하고 있음을 명시 적으로 알려줘야한다고 생각합니다. EG는

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

또한, 왜 (여기

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

은 내가 한 RSpec에 컨트롤러에 대한 링크입니다, 2013-을 https://github.com/westonplatter/questionnaire_engine/tree/engine/spec/controllers

+0

답변 해 주셔서 감사합니다.하지만 제 질문은 구체적으로 라우팅 테스트에 대해 - 즉, 주어진 컨트롤러에서'get : index '만이 아니라 올바른 컨트롤러와 동작에 대한'/ licensing/licenses' 경로를 명시 적으로 테스트하고 싶습니다. 나는 그것이 꽤 아니지만 해결책을 찾았을 것으로 생각합니다. – Brandan

관련 문제