2011-06-18 11 views
2

私は最近、Rails(3.0.8)アプリケーションでrspec-rails(2.6.1)を使用し始めました。私はTest :: Unitに慣れています。私はテストメソッドのためにフィルタを働かせることができません。私は可能な限りDRYを維持したいので、テストメソッドが呼び出される前にAuthlogicユーザーとしてログインする任意のテストメソッドで呼び出すことができるフィルタを設定したいと思います。 Iはspec_helper.rbにRSpec filterを使用することによってこれを達成しようとした:RSpec Railsログインフィルタ

config.before(:each, :login_as_admin => true) do 
    post "/user_sessions/create", :user_session => {:username => "admin", :password => "admin"} 
end 

そして私は(この場合、スペック/コントローラ/ admin_controller_spec.rbに)対応する試験方法でそれを使用する:

require 'spec_helper' 

describe AdminController do 
    describe "GET index" do   
    it("gives a 200 response when visited as an admin", :login_as_admin => true) do 
     get :index 
     response.code.should eq("200") 
    end  
    end 
end 

しかし

Failures: 

    1) AdminController GET index gives a 200 response when visited as an admin 
    Failure/Error: Unable to find matching line from backtrace 
    RuntimeError: 
     @routes is nil: make sure you set it in your test's setup method. 

ブレッヒ:私はRSpecのスペックを実行すると、私はこのエラーを取得します。テストごとに1つのHTTPリクエストしか送信できませんか?私はまた、(config.beforeブロック内で)私のauthenticate_adminメソッドをスタブしてみました。

答えて

3

のようなコントローラの仕様でセットアップフィルタは残念ながら、あなたが何をしようとして行うには、現時点では方法はありませんすることができますグローバルに定義されたbeforeフック。その理由は、など

また、このbeforeフックは彼らが登録を取得した順序で実行され、RSpec.configureで宣言されたものが内部rspec-railsレジスタは、コントローラ、要求、応答を設定するには1前に登録されていることですhttps://github.com/rspec/rspec-rails/issues/391に報告されている。

+1

情報ありがとう、David。私はそれがすでに報告されているのを見てうれしいです。また、RSpecに関するあなたの仕事のおかげで、本当に便利なテストフレームワークです。 – dhulihan

-1

shuldaのマクロンを使用する必要があります。 shoulda使用するには、あなたのspec_helper.rb

RSpec.configure do |config| 
    config.include Clearance::Shoulda::Helpers 
end 

を変更して

require 'spec_helper' 

describe AdminController do 
    fixture :users 

    before(:each) do 
    sign_in_as users(:your_user) 
    end 
    describe "GET index" do   
    it("gives a 200 response when visited as an admin", :login_as_admin => true) do 
     get :index 
     response.code.should eq("200") 
    end  
    end 
end 
+0

これは、 'sign_in_as'が動作する必要があるビット(コントローラなど)が' RSpec.configureで定義された 'before'フックの前に設定されないので、OPが解決しようとしている問題を解決しません'。 –