4

我的Rails 4 beta1應用程序中有多個Rails引擎。我爲每個引擎安裝了rspec-rails寶石。我建立了我的引擎以下命令:多個Rails引擎rspec控制器測試不起作用

rails plugin new store_frontend --dummy-path=spec/dummy -d postgresql --skip-test-unit --mountable 

在我的引擎的虛擬應用程序,我配置的數據庫和路線。下面是例子的routes.rb文件:

Rails.application.routes.draw do 

    mount StoreFrontend::Engine => "/store" 
end 

當我第一次發動機內部rspec的運行,我得到以下錯誤:

1) StoreAdmin::DashboardController GET 'index' returns http success 
    Failure/Error: get 'index' 
    ActionController::UrlGenerationError: 
     No route matches {:action=>"index", :controller=>"store_admin/dashboard"} 
    # ./spec/controllers/store_admin/dashboard_controller_spec.rb:8:in `block (3 levels) in <module:StoreAdmin>' 

,這裏是我的控制器測試/它是從軌道/生成:

require 'spec_helper' 

module StoreFrontend 
    describe HomeController do 

    describe "GET 'index'" do 
     it "returns http success" do 
     get 'index' 
     response.should be_success 
     end 
    end 

    end 
end 

看起來控制器測試不起作用。我有模型測試,它工作正常。任何想法?

更新1: 我的應用程序結構:

bin/ 
config/ 
db/ 
lib/ 
log/ 
public/ 
tmp/ 
engine1/ 
engine2/ 
engine3/ 
+1

規範展示和規範的結果不涉及相同的代碼 – apneadiving 2013-04-26 08:15:21

回答

14

的解決方案是非常簡單的。將use_route添加到您的控制器測試。這裏是例子。

module StoreFrontend 
    describe HomeController do 

    describe "GET 'index'" do 
     it "returns http success" do 
     get 'index', use_route: 'store_frontend' # in my case 
     response.should be_success 
     end 
    end 

    end 
end 
+0

如何更改'StoreFronted'修復'StoreAdmin :: DashboardController'?這是怎麼解決的?沒有路由匹配{:action =>「index」,:controller =>「store_admin/dashboard」}'? – 2013-05-04 22:46:55

+0

看看這個:http://stackoverflow.com/questions/5200654/how-do-i-write-a-rails-3-1-engine-controller-test-in-rspec – Karan 2013-08-02 19:34:48

+0

謝謝,'use_route'解決了UrlGenerationError問題對我來說。 – 2014-12-04 19:33:14

3

配置及規格告訴你是StoreFrontend但誤差爲StoreAdmin::DashboardController。因此,您似乎對您正在測試哪個引擎和/或哪個引擎失敗感到困惑。

當然簡單的解決方案是創建缺少的路線{:action=>"index", :controller=>"store_admin/dashboard"}

2

爲了得到路由正確使用RSpec測試Rails的引擎控制器的時候,我通常是下面的代碼添加到我的spec_helper.rb

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