【问题标题】:Can't destroy current_user in functional test for sign_out method无法在 sign_out 方法的功能测试中销毁 current_user
【发布时间】:2013-08-25 16:38:48
【问题描述】:

我想用这个测试来测试登录/注销方法:

test/controllers/sessions_controller_test.rb

class SessionsControllerTest < ActionController::TestCase
  fixtures :users
  include SessionsHelper

  test "should signin and signout" do
    get :new
    assert_response :success
    post :create, email: users(:alex).email, password: 'qwerty'
    assert_redirected_to profile_url
    assert cookies[:remember_token]
    assert current_user == users(:alex), 'Ooops! Wrong current_user!'

    delete :destroy
    assert_redirected_to signin_url
    debugger
    assert !cookies[:remember_token]
 => assert !current_user, 'Ooops! Current_user not nil!'
  end
end

=>cookies[:remember_token] 消失了,但current_user 仍然是users(:alex),我不明白为什么。我错过了delete :destroy 行吗?
集成测试正在通过,并且在带有注销行为的浏览器中进行实时性能也可以解决问题。

来自会话控制器和助手的方法:

sessions_controller.rb

def destroy
  sign_out
  redirect_to signin_url
end

sessions_helper.rb

def current_user=(user)
  @current_user = user
end

def current_user
  remember_token = User.encrypt(cookies[:remember_token])
  @current_user ||= User.find_by(remember_token: remember_token)
end

def sign_out
  cookies.delete(:remember_token)
  self.current_user = nil
end

【问题讨论】:

  • User.find_by( remember_token: User.encrypt( nil ) ) 返回什么?
  • User.find_by(remember_token: User.encrypt(nil)) =&gt; nil

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


【解决方案1】:

我对 Rails 的了解不如 Sinatra,但不应该通过控制器中的 helpers 方法包含 SessionsHelper 吗?

在测试中直接包含SessionsHelper 模块意味着您现在有两个带有@current_user 和相关方法的类——控制器类和测试类。

因此,控制器路由上的destroy 方法处理它的副本,而测试获得它自己的(它通过共享的cookie 值方便地从数据库中填充)。控制器的destroy 方法不会改变测试对象中的实例变量。

测试可能不应该直接断言 current_user 值,而是依赖于它可以从 Web 服务器响应中提取的数据。在这个测试中你不应该有include SessionsHelper(在帮助器的单元测试中它会是好的)。

【讨论】:

  • 如果我没有这个包含,那么测试不知道current_user 是什么。那么如何在我的测试中测试 cookie-part 和 current_user-part 呢?
  • @Alex Fedoseev:不需要对控制器进行测试来“了解”服务器内部存储的内容作为 current_user 变量。测试网站的行为。例如。对于注销,请检查 1) 网页现在对您的称呼,2) 是否向您提供“登录”或“注销”,3) 您无法访问私有资源。
  • 如果要测试current_user 方法,请为SessionsHelper 模块创建单元测试。 IE。您需要对应用程序中的两个层进行两次测试。
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多