在sign_out方法的功能测试中无法销毁current_user

时间:2013-08-25 16:38:48

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

我想用这个测试测试signin / signout方法:

测试/控制器/ 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

=&gt; 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

1 个答案:

答案 0 :(得分:1)

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

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

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

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