4

我的 Rails 4 beta1 应用程序中有多个 Rails 引擎。我在rspec-rails每个引擎上都安装了 gem。我按照以下命令创建了引擎:

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>'

这是我的控制器测试/它是从 Rails 生成的/:

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/
4

3 回答 3

15

解决方案非常简单。添加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
于 2013-05-04T10:04:55.120 回答
3

您显示的配置和规格适用于,StoreFrontend但错误适用于StoreAdmin::DashboardController. 因此,您似乎只是对您正在测试的引擎和/或哪个引擎出现故障感到困惑。

当然,简单的解决方案是创建缺失的路线{:action=>"index", :controller=>"store_admin/dashboard"}

于 2013-04-29T06:24:10.433 回答
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
于 2013-05-06T03:06:34.350 回答