2013-08-25 3 views
1

내가이 시험에 로그인 절차/signout 방법을 테스트 할 sign_out 방법에 대한 기능 테스트에서 CURRENT_USER를 파괴 할 수 없습니다

테스트/컨트롤러/sessions_controller_test.rb을 에서

class SessionsControllerTest < ActionController::TestCase 
    fixtures :users 
    include SessionsHelper 

    test "should signin and signout" do 
    get :new 
    assert_response :success 
    post :create, email: users(:alex).email, password: 'qwerty' 
    assert_redirected_to profile_url 
    assert cookies[:remember_token] 
    assert current_user == users(:alex), 'Ooops! Wrong current_user!' 

    delete :destroy 
    assert_redirected_to signin_url 
    debugger 
    assert !cookies[:remember_token] 
=> assert !current_user, 'Ooops! Current_user not nil!' 
    end 
end 

=>cookies[:remember_token]은 없어졌지만 current_user 여전히 users(:alex)입니다. 이유는 알 수 없습니다. 내가 delete :destroy 라인에서 스턴을 놓쳤는가?
로그 아웃 기능이있는 브라우저에서 통합 테스트가 통과하고 라이브 성능이 향상됩니다. 세션 컨트롤러와 도우미에서

방법 :

sessions_controller.rb

def destroy 
    sign_out 
    redirect_to signin_url 
end 

sessions_helper.rb

def current_user=(user) 
    @current_user = user 
end 

def current_user 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
end 

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

'User.find_by (remember_token : Remember_token : User.encrypt (nil))'은 무엇을 반환합니까? –

+0

'User.find_by (remember_token : User.encrypt (nil)) => nil' –

답변

1

내가시나보다 더 레일 덜 잘 알고 있지만, SessionsHelper은을 통해 포함하면 안됩니다.컨트롤러의 메소드가 이미 있습니까?

SessionsHelper 모듈을 테스트에 직접 포함 시키면 @current_user이라는 두 클래스와 컨트롤러 클래스 및 테스트 클래스가 있습니다.

그래서 컨트롤러 경로의 destroy 메서드는 해당 복사본을 처리하지만 테스트는 자체 복사본을 가져옵니다 (공유 쿠키 값을 통해 데이터베이스에서 편리하게 채 웁니다). 컨트롤러의 destroy 메서드는 테스트 개체의 인스턴스 변수를 변경하지 않습니다.

테스트에서 current_user 값에 대한 어설 션을 직접 작성해서는 안되지만 웹 서버 응답에서 추출 할 수있는 데이터에 의존해야합니다. 이 테스트에서는 include SessionsHelper을 사용하지 말아야합니다 (도우미에 대한 단위 테스트에서는 정상입니다).

+0

만약이 include가 없다면, test는'current_user'가 무엇인지 알지 못합니다. 그러면 내 테스트에서 쿠키 부분과 current_user 부분을 어떻게 테스트 할 수 있습니까? –

+0

@Alex Fedoseev : 서버가 내부적으로 current_user 변수로 저장 한 것을 컨트롤러가 "알아야"하는 테스트가 필요 없습니다. 사이트의 동작을 테스트합니다. 예 : 로그 아웃하려면 1) 웹 페이지에서 지금 호출하는 내용 2) 사용자가 "로그인"또는 "로그 아웃"을 제공하는지, 3) 개인 자원에 액세스 할 수 없는지 확인하십시오. –

+1

'current_user' 메소드를 테스트하려면'SessionsHelper' 모듈을위한 단위 테스트를 생성하십시오. 나는. 애플리케이션의 두 레이어에 대해 두 가지 테스트가 필요하다. –