14

beforeフィルターとして使用されるアプリケーションコントローラーでメソッドをテストしようとしています。これを行うために、テストで匿名コントローラーをセットアップし、beforeフィルターを適用して正しく機能することを確認しました。

現在、テストは次のようになっています。

describe ApplicationController do
  controller do
    before_filter :authenticated

    def index      
    end
  end

  describe "user authenticated" do
    let(:session_id){"session_id"}
    let(:user){OpenStruct.new(:email => "pythonandchips@gmail.com", :name => "Colin Gemmell")}

    before do
      request.cookies[:session_id] = session_id
      UserSession.stub!(:find).with(session_id).and_return(user)
      get :index
    end

    it { should assign_to(:user){user} }

  end
end

そして、アプリケーションコントローラーは次のようになります。

class ApplicationController < ActionController::Base
  protect_from_forgery

  def authenticated
    @user = nil
  end
end

私の問題は、テストを実行するたびに次のエラーが発生することです

1) ApplicationController user authenticated 
   Failure/Error: get :index
   ActionView::MissingTemplate:
     Missing template stub_resources/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:html], :locale=>[:en, :en]} in view paths "#<RSpec::Rails::ViewRendering::PathSetDelegatorResolver:0x984f310>"

ドキュメントによると、コントローラーテストの実行時にビューはレンダリングされませんが、これはこのアクションにスタブが存在しないことを示しています(ビューが存在しないため理解できます)

誰もがこの問題を解決する方法やビューをスタブアウトする方法の手がかりを持っています。

乾杯コリンG

4

3 に答える 3

19

次のようにして、これを回避できませんでした:

render :nothing => true

#indexアクションの中に?

于 2011-02-28T23:19:13.850 に答える
3

このブログ投稿から変更がない限り、RSpec 2では、コントローラーの仕様を機能させるためにビューテンプレートファイルが必要です。ファイル自体はレンダリングされないため(追加しない限りrender_views)、内容は重要ではありません。実際、空のファイルを。で追加するだけですtouch index.html.erb

于 2011-02-28T23:52:53.453 に答える
3

これを行うより良い方法は、ダミーのビュー ディレクトリを作成することです。実際には有効なビュー テスト用であるため、spec/views は使用しません。代わりに、次のディレクトリ構造を作成します。

spec/test_views/anonymous
     index.html.erb
     ... and any other anonymous controller templates you happen to need ...

前述のように、index.html.erb は空にすることができます。これは、rspec2 がコンテンツではなく、存在のみをチェックするためです。

次に、application.rb イニシャライザに次の行を追加します。

# add a view directory for the anonymous controller tests
config.paths['app/views'] << "spec/test_views" if Rails.env.test?

注: その行を test.rb に入れてみましたが、何らかの理由でそこで動作しないようです。

于 2012-12-10T16:22:39.690 に答える