9

いくつかの機能を備えたベースコントローラーがあります。そのベースコントローラーには外部からアクセスできず、それに一致するルートはありません。

次に、そのコントローラーを他のコントローラーで拡張して機能を追加し、ルートを使用して、そのベースコントローラーを拡張する3つのコントローラーを使用して、それぞれに3つのメソッドを定義します。

ベースコントローラーをテストしたいのですが、できません

post :index

そのアクションのルートがないため(ルート一致エラーなし)

これらのテストは大きく変更されるため、これら3つのコントローラーのいずれかに追加したくありません(コントローラーは... 3週間のキャンペーン中に使用され、その後削除されます)。

いくつかのコード...:

ベースコントローラー、CampaignController

class CampaignController < ApplicationController
  def index
    #some code...
  end

  def campaign_name
    raise('campaign_name missing')
  end

  def campaign_url
    raise('campaign_url missing')
  end

  #more actions....

end

アクセス可能なコントローラーの1つ、SchoolCampaignController

class SchoolCampaignController < CampaignController
  def campaign_name
    'school'
  end

  def campaign_url
    school_url
  end
end

これらのコントローラーは基本的にはそれですが、基本アクションの1つをオーバーライドする必要がある場合があります

だから、私は何が間違っているのですか?CampaignControllerを適切にテストするにはどうすればよいですか?

編集:エラーを発生させる2つのメソッドをテストしたくない、たとえばインデックスをテストしたい、または他のアクションのいくつかをテストしたい(図には示されていません)

「response=controller.index」を試してみましたが、beforeフィルターは呼び出されず、応答はhttp応答ではなく、そのコマンドの出力にすぎません(...responseのような期待はできません。それでrender_template(xxxx)する必要があります)

編集2:ルーティングエラーをバイパスするために、before(:all)ブロックでテスト内にルートを作成しましたが、ルーティングは問題ではありませんが、存在しないビューに関するエラーが発生します(アクセス可能な各コントローラーはすべてを実装します)ビューですが、抽象的なものにはありません)

4

2 に答える 2

12

匿名コントローラーテストを使用できます。ここでうまく説明されています:https ://relishapp.com/rspec/rspec-rails/v/3-6/docs/controller-specs/anonymous-controller 。

以前のように、モンキーパッチを適用するルートは必要ありませんRails.application.routes.draw do

例えば:

describe BaseController, type: :controller do
  controller do
    def index
      render text: "Hello World"
    end
  end

  it "returns 200" do
    get :index
    expect(response).to have_http_status 200
  end
end
于 2017-08-15T15:57:23.280 に答える
11

レンダリングされたビューではなく、をテストして変更するassignsことsessionを計画していると思います。dbテスト目的でのみ、抽象コントローラーのルートを再描画できます(https://gist.github.com/zilkey/543300に例があります)。

ビューがレンダリングされないという問題を回避するには、、、、またはビューが見つからないというエラーから救済するブロックで囲むことをお勧めします(これを行うための小さなヘルパー関数を作成します)get。コントローラが最後のステップとしてビューをレンダリングする場合でも、割り当て、セッション、およびデータベースの変更を確認できるはずです。postputdelete

別の方法は、抽象コントローラーの特定のインスタンス用にテストを記述し、コントローラー名と必要なデータを除外することです。そうすれば、機能していないコントローラーに対する機能テストの問題が発生せず、3週間ごとにテストを簡単に書き直すことができます。

于 2013-04-04T11:12:05.453 に答える