2011-07-20 11 views
3

私はRails Tutorialに従おうとしていますが、私は失敗したrspecを持っていますが、ブラウザではアプリが必要に応じて動作します。つまり、(ブラウザで)サインインして「http:// localhost:3000/users/1/edit」に移動すると、このページが開きます。チュートリアルの以前のすべてのrspecが渡されます。railstutorial.org - rspecは失敗しましたが、ブラウザはすべて正常です

私はRails '3.1.0.rc4'を使用していて、Windowsで作業しています。 (users_controller_spec.rbから)失敗

スペック:factories.rb

Factory.define :user do |user| 
    user.name "Mikhail" 
    user.email "[email protected]" 
    user.password "123456789a" 
    user.password_confirmation "123456789a" 
end 

テキストの

RSpec.configure do |config| 
    config.mock_with :rspec 

    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    config.use_transactional_fixtures = true 

    def test_sign_in(user) 
    controller.sign_in(user) 
    end 
end 

コード:spec_helper.rbからtest_sign_inの

describe "GET 'edit" do 
    before(:each) do 
     @user = Factory(:user) 
     test_sign_in(@user) 
    end 

    it "should be successful" do 
     get :edit, :id => @user 
     response.should be_success 
    end 
end 

コードコンソールから:

Failures: 

    1) UsersController GET 'edit should be successful 
    Failure/Error: response.should be_success 
     expected success? to return true, got false 
    # ./spec/controllers/users_controller_spec.rb:111:in `block (3 levels) in < 
top (required)>' 

UPD:「get:​​edit、:id => @user」の後、ユーザーはログインしていませんが、ブラウザで書いたように、すべてが必要に応じて動作します。そんなことがあるものか?ここ

はApplicationControlelrに含まれているSessionHelperを次のとおりです。

module SessionsHelper 
    def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    self.current_user = user 
    end 

    def sign_out 
    cookies.delete(:remember_token) 
    self.current_user = nil 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @curent_user = user 
    end 

    def current_user 
    @current_user ||= user_from_remember_token 
    end 

    def deny_access 
    redirect_to signin_path, :notice => "Please sign in to access this page." 
    end 

    private 
    def user_from_remember_token 
     User.authenticate_with_salt(*remember_token) 
    end 

    def remember_token 
     cookies.signed[:remember_token] || [nil, nil] 
    end 
end 
+0

spec/factoryから工場のコードを投稿してください する必要があります。user_factory.rb –

+0

私はuser_factory.rbではなくspec/factories.rbを持っています。 (私はコードを投稿しました) –

+0

混乱していることが目立つ部分は、あなたが@userに:id ...を割り当てているということです。idは整数ではありませんか?最悪の場合、ある種の文字列が、ユーザーオブジェクトではありません。 – jaydel

答えて

2

あなたはRSpecのは、それが見ています考えてものを見るためにresponse.bodyをダンプしたことがありますか? をin this questionのように有効にする必要があるかもしれません。

ユーザーが実際にログインしていない可能性があります。そのため、サイトは編集からサインインページなどにリダイレクトされますか?

もう1つの注意点は、HTTPコードが2xxコード(200 ok、201 createdなど)の場合、rspecはbe_successに対してtrueを返すだけです。したがって、コントローラがリダイレクトしている場合(302,304など)、rspecは要求が「成功した」とはみなしません。

アサーションの前にputs response.bodyをドロップしてみると、問題の絞り込みに役立つ場合があります。

+1

response.bodyは "です。あなたはred irectedです。"です。ユーザーが実際にログインしていないようですが、ブラウザでうまくいきます。 –

関連する問題