2

这个问题不是关于如何在 Rails 应用程序中测试控制器。

开发一个 gem 我想测试我的 gem 是否集成在 rails 控制器中。所以在 gem 根目录中运行 rspec 是在 rails 环境之外的。

现在我该如何编写一个控制器测试,它可以使用 rspec 控制器示例组助手,比如getor post

特别是如果我:type => :controller在示例组上设置元标记,rspec 如何设置 rails 环境以及如何连接到该环境以设置路由等。

我宁愿不必设置一个大部分为空的整个 Rails 应用程序骨架。但我什至找不到有关如何做到这一点的信息。测试集成到 Rails 应用程序或多个框架的 gem 的最佳实践是什么。

这些来源最接近我所追求的: 在 Rails 环境之外测试(使用 RSpec)控制器, 但这是针对测试单元的。 http://railsware.com/blog/2012/01/07/testing-gem-integration-with-multiple-ruby-frameworks/ 但这是针对直接挂在rails应用程序类中的水豚。

谢谢大家

4

1 回答 1

1

下面是一个来自 gem 的 Rails 控制器集成测试的一个很好的最小示例。 my_gem. 假设您位于具有简单 rspec 设置的 gem 根目录中(例如使用rspec --init)。然后spec/rails_controller_integration_spec.rb会是这个样子。

rspec/rails是否有必要的要求,其中包括rspec/rails/example基于元标记设置示例组类型。元标记:type => :controller驱动包含适当的组模块RSpec::Rails::ControllerExampleGroup,它为您提供rails 控制器规范的所有好东西以及ActionController::TestCaseget/postlike 的所有好东西。

希望这可以帮助。

我仍然不明白 Rails 环境是如何分配的。特别是如果我想设置两个应用程序TestTailsApp1TestTailsApp2. 有什么建议吗?

require 'spec_helper'
require 'my_gem'

require 'rails'
require 'action_controller/railtie' # allows ActionController::Base
# crucial part here:
require 'rspec/rails'
# note that require 'rspec-rails' does not work

module TestRailsApp
  class Application < Rails::Application
    # app config here
    # config.secret_token = '572c86f5ede338bd8aba8dae0fd3a326aabababc98d1e6ce34b9f5'
    # routes.draw do
    #   resources :models
    # end
  end

  class ApplicationController < ActionController::Base
    # setup
  end

end

describe 'My gem' do

  context "in a Rails controller", :type => :controller do

    controller(TestRailsApp::ApplicationController) do
      extend(RSpec::Rails::ControllerExampleGroup::BypassRescue)
      # example-specific setup for anonymous controller
      # https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs/anonymous-controller
      def index
      end
    end

    before(:each) do
      # request needs to be setup to avoid path setting error
      @request = ActionController::TestRequest.new
    end

    describe "#index" do
      it "works" do
        get :index
        response.body.should == 'index content'
      end
    end
  end

end
于 2013-01-25T15:14:48.170 回答