gem中的框架集成测试:如何为gem rails集成设置rspec控制器测试

时间:2013-01-22 12:02:58

标签: ruby ruby-on-rails-3 rspec gem rspec-rails

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

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

现在我该怎么写一个控制器测试,它可以使用getpost等rspec控制器示例组助手?

特别是如果我在一个示例组中设置了元标记:type => :controller,那么rspec如何设置rails环境以及如何挂钩以便设置路由等等。

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

这些来源最接近我所追求的: Test (with RSpec) a controller outside of a Rails environment 但这是针对测试单位的。 http://railsware.com/blog/2012/01/07/testing-gem-integration-with-multiple-ruby-frameworks/ 但这是为了直接挂在rails应用程序类中的水豚。

感谢所有

1 个答案:

答案 0 :(得分:1)

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

rspec/rails执行必要的要求,among them rspec/rails/example根据元标记设置示例组类型。元标记:type => :controller驱动包含适当的组模块RSpec::Rails::ControllerExampleGroup,为您提供all the goodies of rails controller specing以及all the goodies of ActionController::TestCase like get/post

希望这有帮助。

我仍然没有得到如何分配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