1

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

测试/控制器/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排队吗?
集成测试正在通过,并且在带有注销行为的浏览器中的实时性能也可以解决问题。

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

session_controller.rb

def destroy
  sign_out
  redirect_to signin_url
end

session_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
4

1 回答 1

1

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

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

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

测试可能不应该current_user直接对值做出断言,而是依赖于它可以从 Web 服务器响应中提取的数据。您不应该include SessionsHelper在此测试中进行(在助手的单元测试中可以)。

于 2013-08-25T19:24:16.657 回答