新手问题 遇到一个测试问题,搞了好几天没搞定!

shin · 2016年05月12日 · 最后由 shin 回复于 2016年05月12日 · 2331 次阅读

集成测试登录的问题,环境是 rails 5.0.0.rc1 , devise 4.1.0

# intergation/users_login_test.rb
require 'test_helper'
class UsersLoginTest < ActionDispatch::IntegrationTest
  def setup
    @user = users(:michael)
  end

  test "login with valid information" do
    post user_session_path, session: { email: @user.email, password: 'password' }
    assert_redirected_to @user
    follow_redirect!
    assert_select "a[href=?]", user_session_path, count: 0
  end
...
# users.yml
michael:
  username: Michael
  email: michael@example.com
  encrypted_password: <%= User.new.send(:password_digest, "password") %>
  admin: true
Failure:
UsersLoginTest#test_login_with_valid_information
Expected response to be a <3XX: redirect>, but was a <200: OK>

以上,浏览器手动测试都正确的,但测试就过不了!


第二个问题,上面的 users_login_test.rb 替换 devise sign_in 方法

# intergation/users_login_test.rb
require 'test_helper'
class UsersLoginTest < ActionDispatch::IntegrationTest
  def setup
    @user = users(:michael)
  end

  test "login with valid information" do
    sign_in :user, @user
    assert_redirected_to @user
    follow_redirect!
    assert_select "a[href=?]", user_session_path, count: 0
  end
...

test_helper.rb 有正确引入

# test_helper.rb
class ActionController::TestCase
  include Devise::TestHelpers
end

会遇到没有 sign_in 方法错误!

NoMethodError: undefined method `sign_in' 

抓狂!

我们的项目里面的代码是这样的:

class ActionDispatch::IntegrationTest
  def login_with_session(user)
    open_session do |app|
      app.post user_session_path,
        params: {
          'user[email]' => user.email,
          'user[password]' => user.password
        }
      assert app.controller.user_signed_in?, "login_with_session #{user.email} login failed, #{app.flash[:alert]}"
    end
  end

  def sign_in(user)
    post user_session_path \
          "user[email]"    => user.email,
          "user[password]" => user.password
  end
end

目前 Devise 的 helpers 好像还没有修复好 Rails 5 的,这个问题被标记到了 Devise 4.2.0 的 Milestone

相关的 Issue:

#1 楼 @huacnlee 谢谢大神,我第一个方案实际上想不用 sign_in 直接 post session,但这样为什么不行呢?我参考了 RailsTutorial 8.20 代码 http://railstutorial-china.org/book/chapter8.html

需要 登录 后方可回复, 如果你还没有账号请 注册新账号