- 前言:如果你愿意,请忽略 我是rails的新手,并且正在开发一个需要用户身份验证的项目。 我发现this tutorial并且一直试图通过它来了解正在发生的事情。当然,这并不是我所需要的,所以我一直在修改。该教程在某些方面也已过时,所以当然我必须更新我的代码。所以我的问题的一部分是我不确定这个bug是在我的修改中,还是某些已被弃用的功能,或者是什么。
- 问题
这是(最简单的)测试失败。 (在第一个声明声明中“预计不会为零”。)
def test_authentication
#check we can log in
post :login, :user => { :username => "bob", :password => "test" }
assert_not_nil session[:user_id]
assert_equal users(:bob).id, session[:user_id]
assert_response :redirect
assert_redirected_to :action => 'welcome'
end
它调用user_controller操作登录:
def login
if request.post?
if session[:user_id] = User.authenticate(params[:user][:username], params[:user][:password])
flash[:message] = "Login succeeded!"
redirect_to_stored
else
flash[:warning] = "Login failed."
end
end
end
调用User方法进行身份验证。我知道验证工作正常,但是因为我有一个测试确实通过了:
def test_registration
#check that we can register and are logged in automatically
post :register, :user => { :username => "newuser", :password => "pass", :password_confirmation => "pass", :email => "newuser@web.com" }
assert_response :redirect
assert_not_nil session[:user_id]
assert_redirected_to :action => 'welcome'
end
调用user_controller动作寄存器
def register
@user = User.new(params[:user])
if request.post?
if @user.save
session[:user_id] = User.authenticate(@user.username, @user.password)
flash[:message] = "Registration succeeded"
redirect_to :action => 'welcome'
end
else
flash[:warning] = "Registration failed"
end
end
成功调用身份验证。
用户夹具有一个相关记录:
bob:
username: bob
email: bob@mcbob.com
hashed_password: 77a0d943cdbace52716a9ef9fae12e45e2788d39 # test
salt: 1000
我已经测试了哈希密码和盐 - “test”是正确的密码。
所以根据我的分析,这个bug必须在3个地方之一:
我如何发送我的帖子请求,
我如何访问登录操作中的参数,
或夹具装载的某些方面。
(最初我使用教程的代码显式加载夹具(self.use_instantiated_fixtures = true; fixtures:users),但我读到所有灯具在测试前都自动加载,所以我把它拿出来。那不是改变一件事。)
当然,由于我似乎无法在这些方面找到问题,它也可能在其他任何地方。
答案 0 :(得分:1)
是否可能存在阻止您的操作被调用的过滤器?如果有一般:before_filter => 'login_required'
,那么您可能根本没有达到登录功能。 (虽然不可否认,必须排除注册行动才能通过该测试)
在这样的情况下,坚持一些登录(或通过调试器运行)来查看是否甚至到达您认为失败的方法部分是有用的。如果是我,我会将logger.debug("...")
作为登录方法的第一行,然后在检查request.post?
之后粘贴另一行,然后在验证检查后再粘贴另一行。