2

この質問は、Rails アプリでコントローラーをテストする方法に関するものではありません。

私の宝石がレールコントローラーに統合されているかどうかをテストしたい宝石を開発しています。したがって、gem ルートで rspec を実行することは、Rails 環境の外部にあります。

rspec コントローラー サンプル グループ ヘルパーを使用できるコントローラー テストをどのように記述すればよいのでしょうかgetpost

特に:type => :controller、example group にメタタグを設定した場合、rspec はどのようにレール環境を設定し、どのようにルートを設定するためにそれにフックすることができますか?

ほとんど空の Rails アプリのスケルトン全体をセットアップする必要はありません。しかし、それを行う方法に関する情報さえ見つけることができません。Railsアプリまたは複数のフレームワークに統合されたgemをテストするためのベストプラクティスは何ですか.

これらのソースは、私が求めているものに最も近いものでした: Rails 環境外でコントローラーを (RSpec で) テストします が、これはテスト ユニット用です。 http://railsware.com/blog/2012/01/07/testing-gem-integration-with-multiple-ruby-frameworks/ ですが、これは Rails app クラスに直接フックするカピバラ用です。

皆さんありがとう

4

1 に答える 1

1

以下は、gem からの Rails コントローラー統合テストの最小限の例です。 my_gem. 単純な rspec セットアップ (たとえばrspec --init) を使用して gem ルートにいるとします。するとspec/rails_controller_integration_spec.rbこんな感じになります。

rspec/railsメタタグに基づいてグループ タイプの例を設定する必要があります。rspec/rails/exampleメタタグ:type => :controllerは適切な group モジュールの組み込みを促進し、Rails コントローラー仕様のすべての利点とlikeのすべてのRSpec::Rails::ControllerExampleGroup利点を提供します。ActionController::TestCaseget/post

お役に立てれば。

Rails 環境がどのように割り当てられるかはまだわかりません。特に、2 つのアプリ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 に答える