2011-01-02 18 views
26

Xin chào, tôi muốn thực hiện một số thử nghiệm chức năng cho ứng dụng Rails 3 sử dụng Devise và CanCan.Kiểm tra chức năng với Rails và Devise. Những gì để đặt trong đồ đạc của tôi?

Trong mô hình tài khoản của tôi, tôi có tuổi sử dụng, tôi muốn kiểm tra mà người dùng chỉ có thể truy cập một trang nhất định nếu họ là:

  1. Logged trong
  2. Hơn 35

Tôi đã thấy trong tài liệu Devise mà tôi có thể sử dụng: * sign_in * và tôi đã đặt nó trong các bài kiểm tra của mình và nó có vẻ hoạt động - bài kiểm tra không lỗi vì tôi có:

include Devise::TestHelpers 

trong * test_helper.rb của tôi *

Khi tôi lấy nó ra, thử nghiệm của tôi có lỗi vì * sign_in * không được xác định. Vì vậy, nó không phải là một vấn đề trợ giúp.

Khi tôi chạy thử nghiệm và kiểm tra xem nếu span # loggedin có một lần thử nghiệm không thành công vì có 0 lần xuất hiện. span # loggedin chỉ xuất hiện * nếu user_signed_in? *

Tôi cần đặt gì trong đồ đạc hoặc thử nghiệm để tạo người dùng thử cũng là người dùng đã đăng ký đầy đủ (đã xác nhận v.v.)?

Xem Code:

<% 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 %> 

Kiểm tra Code:

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

Fixture:

one: 
email: [email protected] 
age: 36 

Nó hoạt động ổn trong phát triển khi tôi tự đăng nhập nhưng tôi hy vọng để tự động nó tất cả - điểm thử nghiệm thực sự !!

Trả lời

7

Tôi đã sắp xếp sự cố - Tôi đã đăng nhập không đúng người dùng.

thử nghiệm của tôi nên thỏ đọc:

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

này cũng làm việc và loại bỏ một dòng mã:

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

sự hiểu biết của tôi về Lịch thi đấu còn thiếu ...

Nhưng trở lại câu hỏi - những gì cần đặt trong đồ đạc:

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 

Bây giờ nó hoạt động. Nếu có một cách dễ dàng hơn mà tạo ra một người dùng trong dev và dán dữ liệu vào một fixture xin vui lòng đăng.

+1

Bạn có thể sử dụng ERB trong đồ đạc của mình, điều này sẽ giúp bạn làm cho các đồ đạc dễ bảo trì hơn. Bạn có thể sử dụng các công cụ như FactoryGirl thay vì (hoặc kết hợp với) đồ đạc, điều này sẽ làm cho các bài kiểm tra của bạn dễ dàng hơn để duy trì, nhưng sẽ làm chậm các bài kiểm tra của bạn một cách đáng kể. – iain

+0

Tôi biết về việc sử dụng ERB trong đồ đạc của mình nhưng tôi cần phải làm gì để tạo ra vật cố định ở trên? Đó là trái tim của câu hỏi của tôi - đặc biệt là những gì tôi cần phải đặt trong đồ đạc của tôi? –

+1

Tôi biết đây là một oldie, nhưng tôi stumbled khi nó tìm kiếm sự giúp đỡ trong một kịch bản tương tự. Các thử nghiệm của tôi cho thấy rằng chỉ cần thêm dấu thời gian 'confirmed_at' vào lịch thi đấu của bạn có vẻ như là lừa. – Chris

64

Giải pháp cho Devise trước 3.2.0

Tôi nghĩ rằng đây có thể là những gì bạn đang tìm kiếm:

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

Nó hoạt động khi muối là con số không.

Và vì thế trong trận đấu, bạn có thể làm điều này:

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

Giải pháp cho các phiên bản lập mưu 3.2.0 đến 3.5.0

Tại lập mưu 3.2.0, một method was created precisely for this purpose (@Inkling update). Đối với các phiên bản này, encrypted_password phải được định nghĩa như sau:

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

nơi User là lớp người dùng của bạn.

Lưu ý rằng điều này chỉ áp dụng nếu bạn đang sử dụng thuật toán mã hóa mặc định (bcrypt).


Giải pháp cho các phiên bản lập mưu 3.5.1 trở lên

Như Katarzyna đã chỉ ra: Device.bcrypt has been deprecated trong phiên bản 3.5.1. Từ phiên bản đó, encrypted_password phải được định nghĩa như sau:

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

Cập nhật tốt đẹp @Inkling – ReggieB

+2

Nếu bạn mới sử dụng ứng dụng và không chắc chắn thuật toán mã hóa nào đang sử dụng, hãy kiểm tra tệp config/initializers/devise.rb để biết cài đặt 'config.encryptor'. Một đầu mối khác là nếu Gemfile bao gồm 'gem 'devise-encryptable'' (được sử dụng để chọn bất kỳ thứ gì khác ngoài bcrypt để mã hóa). – pdobb

+1

Devise.bcrypt không còn được dùng nữa; sử dụng Devise :: Encryptor.digest – Katarzyna

1

Làm việc cho tôi.

tôi không thay đổi bất cứ điều gì về trận đấu của tôi sử dụng, nó là như thế này:

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

Nhưng tôi đã thay đổi tôi test_helper.rb và tôi thêm này đến lớp ActionController (điều này sẽ làm việc cho tất cả các bài kiểm tra bộ điều khiển):

class ActionController::TestCase 
    include Devise::TestHelpers 

    setup do 
     sign_in users(:one) 
    end 
end 
Các vấn đề liên quan