如何在Rails 4中使用Authlogic和HTTP post request创建会话(测试)



我对Rails 4有点陌生,正在做一个需要身份验证的项目。我最近实现了Authlogic来处理它。

问题是我尝试使用HTTP post登录的会话控制器的特定测试,该测试无法将我重定向到登录路径。我对此很感兴趣,因为它可能会在以后使用我的Rails应用程序中的用户来记录Android应用程序。

这是测试:

sessions_controller_test.rb
   test "should post create" do
     this_user = users(:one)
     post :create, username: this_user.username, password: 'secret'
     assert_redirected_to admin_url
     assert_equal this_user.id, current_user.id #session[:user_id]
   end

这是正在测试的代码:

sessions_controller.rb       
   def create
    @user_session = Session.new(params[:user_session])
    if @user_session.save
     flash[:notice] = "Login successful."
     redirect_to admin_url
    else
     redirect_to login_url, alert: "Invalid user/password combination"
    end
   end

测试结果:

  2) Failure:
SessionsControllerTest#test_should_post_create [/home/mario/railsprj/depot/test/controllers/sessions_controller_test.rb:13]:
Expected response to be a redirect to <http://test.host/admin> but was a redirect to <http://test.host/login>.
Expected "http://test.host/admin" to be === "http://test.host/login".

我也遇到过类似的问题。检查session_controller#create的else分支中的@user_session.errors。或者暂时切换到@user_session.save!,在验证错误时抛出错误。在我的例子中,是与用户相关的验证。Confirmed_at失败。

另一件要检查的事情是你的测试有setup :activate_authlogic,这是在你可以Session.create.

之前所需要的

希望现在给出答案还不算太晚。你代码中的问题是你缺少了参数。

你必须更改测试:

  test "should post create" do
     this_user = users(:one)
     post :create, user_session: { username: this_user.username, password: 
'secret'}

或者你必须改变控制器:

sessions_controller.rb       
   def create
    @user_session = Session.new(username: params[:username], password: params[:password])

只有一个选择。我想最好是先解决,不过是一种滋味。

最新更新