2016-08-13 77 views
1

我的應用允許教師爲他們的學生啓動帳戶。爲了避免讓教師爲學生考慮密碼的負擔,我寫了一種自動生成密碼的方法。該功能在開發和生產中正常工作。我試圖編寫一個測試來確保此功能可以繼續工作,但結果並非我所期望的。自動生成密碼的Rails測試

我的直覺是,我的錯誤是在測試:

students_controller_test.rb

test "Auto Password" do 
    post students_path, params: { student: { first_name: "Ren", 
             last_name: "Stimpy", 
             studentNum: 13}, 
           aula: { seminar_id: @seminar.id } } 
    student = assigns(:student) 
    assert_equal "rs13", student.username 
    assert_equal Student.digest('rs13'), student.password_digest 
end 

而且結果:

FAIL["test_Auto_Password", StudentsControllerTest, 2.0619301088154316] 
test_Auto_Password#StudentsControllerTest (2.06s) 
     --- expected 
     +++ actual 
     @@ -1,2 +1 @@ 
     -# encoding: ASCII-8BIT 
     -"$2a$04$1FfqltU9B7yawIs7Z4GWLe9eaaVhFxdPvF9Vg2UWUbYxwqQ5j/9Dm" 
     +"$2a$04$CuN1BLKhI/Fx9ueB4QAskOl9Ik.og26TJeeDDF5tdur1erILzjj7W" 
     test/controllers/students_controller_test.rb:91:in `block in <class:StudentsControllerTest>' 

我可能誤解的東西有關密碼的方式消化工作。學生的密碼應該是「rs13」。所以我期望Student.digest('rs13')應該等於student.password_digest。顯然,他們不是。

順便說一下,密碼「rs13」來自我的students_controller中的一個方法,該方法通過連接學生的姓名縮寫和學號來自動創建用戶名。密碼也等於這個。

預先感謝您的任何見解!

回答

0

後來我才意識到,「認證」方法是實現我所嘗試的最佳方式。簡單地將測試的最後一行替換爲:

assert student.authenticate("rs13") 
2

問題是BCrypt::Password will generate the digest with different salt,所以用於創建密碼&檢查的鹽是不同的,這就是爲什麼你的測試失敗。

檢查this出來,那麼你可以使用運營商==檢查可能的憑證是否正確:

assert_equal 'rs13', student.password_digest 

assert_equal實際使用操作==compare

+0

謝謝你的來源。絕對是我在找的東西,但我無法弄清楚確切的語法。 「斷言」rs13'== student.password_dig est「返回false。 「Assert_equal'rs13'== student.password_dig est」給出錯誤。 「斷言」rs13'== student.password「確實有效,但由於它測試密碼而不是password_digest,所以我擔心這不是一個絕對的測試。我意識到我可以通過使用student.authenticate來測試我的結果。不過,如果不考慮你的迴應,這可能不會發生。那謝謝啦! - 傑夫Zivkovic –