2009-07-14 14 views
0

--preface:必要ならば無視してください。
私はレールを初めて使い、ユーザー認証が必要なプロジェクトに取り組んでいます。 私はthis tutorialを見つけ、それを通って何が起こっているのかを理解しようとしてきました。もちろん、それはまさに私が必要としているものではありませんので、私は順番に変更しています。このチュートリアルは一部の分野では古くなっているので、もちろん私のコードを更新しなければなりません。私の問題の一部は、バグが修正に含まれているのか、非難されている機能なのか、何がわからないのかということです。レールユーザ認証のコントローラテストに失敗しました

- 質問
これは失敗する(最も単純な)テストです。 (最初のassert文の "ゼロではないと予想される"。)

def test_authentication 
    #check we can log in 
    post :login, :user => { :username => "bob", :password => "test" } 
    assert_not_nil session[:user_id] 
    assert_equal users(:bob).id, session[:user_id] 
    assert_response :redirect 
    assert_redirected_to :action => 'welcome' 
end 

それはuser_controllerアクションログインを呼び出す:ユーザーメソッドの認証を呼び出す

def login 
    if request.post? 
    if session[:user_id] = User.authenticate(params[:user][:username], params[:user][:password]) 
    flash[:message] = "Login succeeded!" 
    redirect_to_stored 
    else 
     flash[:warning] = "Login failed." 
    end 
    end 
end 

を。

def test_registration 
    #check that we can register and are logged in automatically 
    post :register, :user => { :username => "newuser", :password => "pass", :password_confirmation => "pass", :email => "[email protected]" } 
    assert_response :redirect 
    assert_not_nil session[:user_id] 
    assert_redirected_to :action => 'welcome' 
end 

正常に認証を呼び出す

def register 
    @user = User.new(params[:user]) 
    if request.post? 
    if @user.save 
     session[:user_id] = User.authenticate(@user.username, @user.password) 
     flash[:message] = "Registration succeeded" 
     redirect_to :action => 'welcome' 
    end 
    else 
    flash[:warning] = "Registration failed" 
    end 
end 

user_controllerのアクションレジスタを呼び出す:私は合格しない単一のテストを持っているので、私は、しかし、その認証が正常に動作します知っています。

ユーザーは、固定具1つの関連レコードを持って:

bob: 
    username: bob 
    email: [email protected] 
    hashed_password: 77a0d943cdbace52716a9ef9fae12e45e2788d39 # test 
    salt: 1000 

私は、ハッシュされたパスワードと塩をテストしてみた - 「テスト」は、正しいパスワードです。私は、
または一部をログインアクションのパラメータにアクセスしていますどのように私のポスト要求、
を送っていますか

は、だから私の分析によって、バグが3ヶ所のいずれかであることを持っています固定具装填の態様。

(元々、チュートリアルのコードを使用して明示的にフィクスチャをロードしていましたが(self.use_instantiated_fixtures = true;フィクスチャ:users)、テスト前にすべてのフィクスチャが自動的にロードされるので、 t変更するもの)

もちろん、私はこれらの分野で問題を見つけることができないので、他の場所にも同様に存在する可能性があります。

答えて

1

アクションが呼び出されないようにするフィルタが存在する可能性はありますか? :before_filter => 'login_required'の場合は、ログイン機能にまったく到達していない可能性があります。 (ただし、テストが合格するためには登録行為を除外する必要があります)

このような場合には、ログインしているか、デバッガを実行して、あなたが失敗していると思う方法。それが私の場合は、logger.debug("...")をログイン方法の最初の行に貼り付け、もう1つはrequest.post?のチェックの後、もう1つは認証チェックの後に貼り付けます。

+0

私はそれを逃したとは思えませんが、それは実際にフィルタでした。もともとlog_inという関数に名前をつけていましたが、審美的な理由からloginという名前に変更されましたが、フィルタの例外は決して更新されませんでした。 ありがとうございます! – dorr

関連する問題