2012-04-20 9 views
2

私はTDDの新機能ですので、わかっていれば分かりますが、DeviseとOmniauthを使って開発中に完全に動作するログインシステムを持っています。何らかの理由でrspecテストを実行すると失敗します。dev_sign_in_and_redirectがrspecテストを失敗させます

場合、私は、私が実際に

Failure/Error: get :create 
    NoMethodError: 
     undefined method `user' for nil:NilClass 
    # ./app/controllers/authentications_controller.rb:13:in `create' 

を取得し、テストを実行すると、このRSpecのテスト

describe "GET 'create'" do 
    before(:each) do 
     request.env['omniauth.auth'] = { "provider" => "facebook", "uid" => "1298732", "info" => { "first_name" => "My", "last_name" => "Name", "email" => "[email protected]" } } 
    end 

    it "should create a user" do 
     lambda do 
     get :create 
     end.should change(User, :count).by(1) 
    end 
    end 

と私の認証コントローラ

class AuthenticationsController < ApplicationController 
    def create 
    omniauth = request.env['omniauth.auth'] 
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid']) 
    if authentication 
     flash[:notice] = "Signed in successfully" 
     sign_in_and_redirect(:user, authentication.user) 
    else 
     user = User.find_by_email(omniauth['info']['email']) || User.new(:email => omniauth['info']['email'], :fname => omniauth['info']['first_name'], :lname => omniauth['info']['last_name']) 
     user.authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid']) 
     if user.save :validate => false 
     flash[:notice] = "Login successful" 
     sign_in_and_redirect(:user, user) 
     else 
     flash[:notice] = "Login failed" 
     redirect_to root_path 
     end 
    end 
    end 
end 

のためのアクションを作成してテストしています私はsign_in_and_redirectステートメントを削除し、テストに合格します。興味深いことに、sign_in_and_redirectの代わりにsign_inを使用すると失敗します。

なぜこのようなことが起こるのでしょうか。特に開発時に自分自身でアカウントを作成すると、正常に動作します。

ありがとうございました!あなたは工夫のユーティリティメソッドのいずれかを使用している場合

+2

私は自分を解くかなり確信して問題。 どうやら、テスト中に考案のsign_inメソッドを使用するためにあなたが呼び出しを行う必要があります。 が考案:: TestHelpersそれを含めた後 含め、私の問題は去っていきました、とすべてが正常に機能しているようです。 –

答えて

0

How To: Controllers and Views tests with Rails 3 (and rspec)

コントローラの仕様は、箱から出して動作しません。 RSpecのレール-2.0.0のよう

と工夫-1.1を、あなた仕様に工夫を置くための最良の方法は、spec_helperに以下を追加するだけです:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 
関連する問題