2011-01-02 3 views
26

안녕하세요, Devise와 CanCan을 사용하는 Rails 3 앱의 기능 테스트를하고 싶습니다. 내 사용자 모델에서Rails 및 Devise를 사용한 기능 테스트. 내 비품에 무엇을 넣어야합니까?

나는 나는 그들이 경우 사용자는 특정 페이지를 방문 할 수 있는지 테스트하려면, 사용자의 연령이 :

  1. 은 로그인 한

35 나는 Devise 문서에서 다음을 사용할 수 있음을 보았습니다 : * sign_in * 그리고 나는 그것을 내 테스트에 넣었습니다. 나는 가지고 있기 때문에 테스트에 오류가 없습니다.

내 * test_helper.rb *

* * sign_in *이 정의되지 않았기 때문에 테스트를 수행 할 때 오류가 발생합니다. 그래서 도우미 문제는 아닙니다.

테스트를 실행하고 span # loggedin에 발생이 하나 있는지 확인하려면 0 번 발생하므로 테스트가 실패합니다. span # loggedin 만 표시 * user_signed_in 인 경우 *

등록 된 사용자 (확인 된 사용자) 인 테스트 사용자를 만들기 위해 필자의 설비 또는 테스트를 수행하려면 무엇이 필요합니까?

보기 코드 :

<% if user_signed_in? %> 
    <span id="loggedin">User is signed in</span> 
    User age is <span id="age"><%= current_user.age.to_s %></span> 
<% end %> 

시험 코드 :

test "should get index" do 
    sign_in :one 
    get :index 
    assert_response :success 
    assert_select 'span#loggedin', :count => 1 
end 

기구 : 나는 수동으로 로그인 할 때

one: 
email: [email protected] 
age: 36 

이 개발 괜찮 작동하지만 나는 그것을 자동화 할 수 바라고 있어요 모두 - 테스트의 요점 !!

답변

7

문제를 분류했습니다. 사용자를 잘못 로깅했습니다.

test "should get index" do 
    @user = users(:one) 
    sign_in @user 
    get :index 
    assert_response :success 
    assert_select 'span#loggedin', :count => 1 
end 

이것은 또한 작동 및 코드의 라인 제거 :

토끼해야 내 시험은 읽기

test "should get index" do 
    sign_in users(:one) 
    get :index 
    assert_response :success 
    assert_select 'span#loggedin', :count => 1 
end 
설비에 대한 이해가 부족했던

...

그러나 위로를 질문 - 비품에 넣을 내용 :

one: 
email: [email protected] 
encrypted_password: $2a$10$PoBe1MvkoGJsjMVTEjKqgeBUp.xdfzWoiDjBzQhtLAj16NqIa2fOy 
password_salt: $2a$10$PoBe1MvkoGJsjMVTEjKqge 
reset_password_token: nil 
remember_token: nil 
remember_created_at: nil 
sign_in_count: 1 
current_sign_in_at: 2011-01-02 08:31:23 
last_sign_in_at: 2011-01-02 08:31:23 
current_sign_in_ip: 127.0.0.1 
last_sign_in_ip: 127.0.0.1 
confirmation_token: nil 
confirmed_at: 2011-01-02 08:31:23 
confirmation_sent_at: 2011-01-02 08:30:59 
failed_attempts: 0 
unlock_token: nil 
locked_at: nil 
authentication_token: nil 
created_at: 2011-01-02 08:30:59 
updated_at: 2011-01-02 08:31:23 
age: 36 

이제 작동합니다. dev에 사용자를 생성하고 데이터를 조명기에 붙여 넣는 것이 더 쉬운 경우 게시하십시오.

+1

조명기에서 ERB를 사용하면 조명기를 쉽게 유지 보수하는 데 도움이됩니다. Fixgure 대신 FactoryGirl과 같은 도구를 사용하면 테스트를 쉽게 유지할 수 있지만 테스트 속도가 크게 떨어집니다. – iain

+0

필자의 설비에서 ERB를 사용하는 것에 대해 알고 있지만 위의 설비를 생성하려면 ERB는 무엇이 필요합니까? 그게 내 질문의 핵심 이었어. 구체적으로 내 비품에 넣어야 할게 뭐야? –

+1

나는 이것이 노인이라고 알고 있지만 비슷한 시나리오에서 도움을 구하는 것에 비틀 거렸다. 내 실험에 따르면 단순히 'confirmed_at' 타임 스탬프를 조명기에 추가하는 것이 트릭을 수행하는 것으로 보입니다. – Chris

64

개발자 용 사전 3.2.

0 나는 이것이 당신이 찾고있는 것 같아요 :

User.new.send(:password_digest, 'password') 

소금이 전무되어있을 때에 만 의미가 있습니다.

그러므로 당신의 고정 당신이 수행 할 수 있습니다 고안 3.2.0에서

one: 
    email: '[email protected]' 
    encrypted_password: <%= User.new.send(:password_digest, 'password') %> 

고안 버전의 솔루션 3.2.0

3.5.0을하는 method was created precisely for this purpose (@ 업데이트 업데이트). 이 버전의 encrypted_password는은 다음과 같이 정의한다 : User는 사용자 모델의 클래스입니다

encrypted_password: <%= Devise.bcrypt(User, 'password') %> 

.

기본 암호화 알고리즘 (bcrypt)을 사용하는 경우에만 적용됩니다. 유증 버전 3.5.1 및 Katarzyna으로


솔루션은 지적했습니다 Device.bcrypt has been deprecated 버전 3.5.1에서. 해당 버전에서 encrypted_password는 다음과 같이 정의해야합니다.

encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %> 
+3

좋은 업데이트 @Inkling – ReggieB

+2

앱을 처음 사용하고 Devise가 사용하는 암호화 알고리즘을 잘 모르는 경우 config/initializers/devise.rb 파일에서'config.encryptor' 설정을 확인하십시오. 또 다른 단서는 Gemfile에'gem 'devise-encryptable'(암호화를 위해 bcrypt 이외의 것을 고르는 데 사용됨)이 포함되어 있는지입니다. – pdobb

+1

Devise.bcrypt는 더 이상 사용되지 않습니다. Devise :: Encryptor.digest 사용 – Katarzyna

1

저에게 효과적입니다.

내 사용자기구에 아무것도 변경하지 않았다, 그것은 다음과 같이이다 :

one: 
    id: 1 
    name: MyString 
    email: [email protected] 
    group_id: 2 
    encrypted_password: <%= Devise.bcrypt(User, 'password') %> 

그러나 (이 모든 컨트롤러 테스트를 위해 작동합니다) 클래스 ActionController이를 내 test_helper.rb을 변경 내가 추가 :

class ActionController::TestCase 
    include Devise::TestHelpers 

    setup do 
     sign_in users(:one) 
    end 
end 
관련 문제