GEM 中的框架集成测试:如何为 GEM Rails 集成设置 Rspec 控制器测试



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

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

现在我该如何编写可以使用 rspec 控制器示例组助手(如 getpost)的控制器测试?

特别是如果我在示例组上设置元标记:type => :controller,RSPEC 如何设置 rails 环境以及如何挂钩以表示设置路由等。

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

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

谢谢大家

下面是一个来自 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::TestCase的所有好处,如 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

最新更新