rails用户身份验证的控制器测试失败

时间:2009-07-14 19:49:11

标签: ruby-on-rails ruby

- 前言:如果你愿意,请忽略 我是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),但我读到所有灯具在测试前都自动加载,所以我把它拿出来。那不是改变一件事。)

当然,由于我似乎无法在这些方面找到问题,它也可能在其他任何地方。

1 个答案:

答案 0 :(得分:1)

是否可能存在阻止您的操作被调用的过滤器?如果有一般:before_filter => 'login_required',那么您可能根本没有达到登录功能。 (虽然不可否认,必须排除注册行动才能通过该测试)

在这样的情况下,坚持一些登录(或通过调试器运行)来查看是否甚至到达您认为失败的方法部分是有用的。如果是我,我会将logger.debug("...")作为登录方法的第一行,然后在检查request.post?之后粘贴另一行,然后在验证检查后再粘贴另一行。