2013-01-18 34 views
8

Tôi đang cố gắng để kiểm tra một bộ điều khiển bên trong một động cơ ứng dụng của tôi đang sử dụng. Các spec không phải là trong động cơ, nhưng trong ứng dụng riêng của mình (tôi đã cố gắng để kiểm tra trong động cơ nhưng cũng có vấn đề).Rails engine: rake tuyến hiển thị các tuyến đường của nó nhưng trên rspec thực hiện "Không có tuyến đường phù hợp" được ném

động cơ của tôi có routes.rb sau:

Revision::Engine.routes.draw do 
    resources :steps, only: [] do 
    collection { get :first } 
    end 
end 

Động cơ được gắn trên routes.rb ứng dụng thông thường:

mount Revision::Engine => "revision" 

Khi tôi chạy rake routes, tại dòng cuối cùng tôi nhận được :

Routes for Revision::Engine: 
first_steps GET /steps/first(.:format) revision/steps#first 
     root /      revision/steps#first 

Trên bộ điều khiển của động cơ (lib/revision/app/controllers/revision/steps_controller.rb), tôi có :

module Revision 
    class StepsController < ApplicationController 
    def first 
    end 
    end 
end 

On RSpec, tôi thử nghiệm bộ điều khiển này với:

require 'spec_helper' 
describe Revision::StepsController do 
    it "should work" do 
    get :first 
    response.should be_success 
    end 
end 

Sau đó, khi tôi chạy spec này, tôi nhận được:

ActionController::RoutingError: 
    No route matches {:controller=>"revision/steps", :action=>"first"} 

Để chắc chắn rằng con đường không thực sự tồn tại, tôi đã thêm thông số này vào thông số:

before do 
    puts @routes.set.to_a.map(&:defaults) 
end 

Và kết quả là:

[...] 
{:action=>"show", :controller=>"devise/unlocks"} 
{:action=>"revision"} 

Chỉ có thông số :action.

Điều gì có thể sai?

Trả lời

3

Khi bạn đang cố gắng kiểm tra bộ điều khiển của động cơ, bạn cần chỉ định bộ định tuyến nào bạn muốn kiểm tra bộ điều khiển sử dụng, nếu không nó sẽ chạy nó đối với ứng dụng chính. Để làm điều đó, hãy vượt qua use_route: :engine_name theo phương thức get.

require 'spec_helper' 
describe Revision::StepsController do 
    it "should work" do 
    get :first, use_route: :revision # <- this is how you do it 
    response.should be_success 
    end 
end 
+0

Đồng ý. Lưu ý rằng điều này đúng chỉ khi Engine có một không gian tên riêng biệt. –

+0

Điều này đã giúp tôi về một vấn đề mà thậm chí không liên quan đến động cơ của Rails. Tôi đã cố gắng để truy cập một tuyến đường bộ sưu tập lồng nhau bên trong của một nguồn tài nguyên, và cách duy nhất tôi có thể làm cho nó nhận ra hành động với một tuyến đường hợp lệ là để vượt qua trong 'use_route:: name_of_route'. Cảm ơn! –

Các vấn đề liên quan