2016-08-13 80 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 –