【问题标题】:authentication problems in rails functional testsRails 功能测试中的身份验证问题
【发布时间】:2011-02-14 22:21:19
【问题描述】:

我正在测试这个控制器:

class SessionsController < ApplicationController
  def new
  end

  def create
    @current_user = User.find_by_login_and_password(
      params[:login], params[:password]
    )

    if @current_user
      session[:user_id] = @current_user.id
      if session[:return_to]
        redirect_to session[:return_to]
        session[:return_to] = nil
      else
        redirect_to stories_path
      end
    else
      render :action => 'new'
    end
  end

  def destroy
    session[:user_id] = @current_user = nil
  end

end

使用这个夹具(users.yml):

patrick:
  login: patrick
  password: sekrit
  name: Patrick Lenz
  email: patrick@limited-overload.de

john:
  login: john
  password: gh752px
  name: John Doe
  email: john@doe.com

还有这个功能测试:

require 'test_helper'

class SessionsControllerTest < ActionController::TestCase
  def test_should_show_login_form
    get :new
    assert_response :success
    assert_template 'new'
    assert_select 'form p', 4
  end

  def test_should_perform_user_login
    post :create, :login =>'patrick', :password => 'sekrit'
    assert_redirected_to stories_path
    assert_equal users(:patrick).id, session[:user_id]
    assert_equal users(:patrick), assigns(:current_user)
  end
end

但是,我得到了这个失败:

test_should_perform_user_login(SessionsControllerTest) [/home/ygamretuta/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.9/lib/action_controller/test_case.rb:119]:
Expected response to be a <:redirect>, but was <200>.
Expected block to return true value

登录逻辑正常,但我的测试失败,我的故事路径路径:

story_votes GET    /stories/:story_id/votes(.:format)          {:controller=>"votes", :action=>"index"}
                POST   /stories/:story_id/votes(.:format)          {:controller=>"votes", :action=>"create"}
 new_story_vote GET    /stories/:story_id/votes/new(.:format)      {:controller=>"votes", :action=>"new"}
edit_story_vote GET    /stories/:story_id/votes/:id/edit(.:format) {:controller=>"votes", :action=>"edit"}
     story_vote GET    /stories/:story_id/votes/:id(.:format)      {:controller=>"votes", :action=>"show"}
                PUT    /stories/:story_id/votes/:id(.:format)      {:controller=>"votes", :action=>"update"}
                DELETE /stories/:story_id/votes/:id(.:format)      {:controller=>"votes", :action=>"destroy"}
        stories GET    /stories(.:format)                          {:controller=>"stories", :action=>"index"}
                POST   /stories(.:format)                          {:controller=>"stories", :action=>"create"}
      new_story GET    /stories/new(.:format)                      {:controller=>"stories", :action=>"new"}
     edit_story GET    /stories/:id/edit(.:format)                 {:controller=>"stories", :action=>"edit"}
          story GET    /stories/:id(.:format)                      {:controller=>"stories", :action=>"show"}
                PUT    /stories/:id(.:format)                      {:controller=>"stories", :action=>"update"}

我可能会错过什么?

编辑:这是我的用户表的结构(它仅对书籍示例使用纯文本密码)

CREATE TABLE "users" (
 "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
 "login" varchar(255), 
 "password" varchar(255), 
 "name" varchar(255), 
 "email" varchar(255), 
 "created_at" datetime, 
 "updated_at" datetime
)

【问题讨论】:

    标签: ruby-on-rails ruby functional-testing


    【解决方案1】:

    Ygam,我 99% 确定问题在于密码不匹配。您是否使用加盐/加密密码?如果是这种情况,请检查您的灯具是否有纯文本密码。

    我非常有信心是这种情况,因为您正在发帖并获得 200,而create 中返回 200 的唯一路径是用户/密码对验证失败时。

    如果您使用加盐密码,您可能需要在您的设备中执行类似的操作

    <% SALT = "NaCl" unless defined?(SALT) %>
    one:
      name: dave
      hashed_password: <%= User.encrypt_password('secret', SALT) %>
      salt: <%= SALT %>
    
    two:
      name: MyString
      hashed_password: MyString
      salt: MyString
    

    【讨论】:

    • 我正在阅读的这本书只有例如纯文本密码,这就是我的 sqlite 文件中的内容。让我试试你的解决方案,稍后我会回复你
    • 没有用。我没有使用加密密码,因为这本书就是这样写的。有什么方法可以让我使用纯文本密码进行这项工作?
    • Ygam,你能把应用程序上传到某个地方吗?另外,你用的是哪本书?因为你没有提到标题:)
    • Sitepoint 的简单 Rails 2。遇到一些麻烦,因为这本书是在 2008 年写成的,使用的是 Rails 2.0 版。抱歉,我无法在任何地方上传。
    • 让它工作。我的 test_helper.rb 中缺少一个固定装置:all。我会接受这个答案,因为如果我的案例不像我的 test_helper T_T 中缺少一行那么愚蠢,这将是最合适的答案。
    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2010-10-26
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多