如何测试设计是否使用登录而不是电子邮件登录用户?

How to test if devise is signing users in with login, not email?

我正在尝试确认 devise 是否使用登录,而不是电子邮件登录。这就是我目前所知道的:

test/controllers/sessions_controller_test.rb:

require 'test_helper'

class Devise::SessionsControllerTest < ActionController::TestCase
  test "should sign in using login" do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    post :create, user: {login: 'login', password: 'password'}
    assert_response :success
  end
end

现在它说:

  1) Error:
Devise::SessionsControllerTest#test_should_sign_in_using_login:
NoMethodError: undefined method `authenticate?' for nil:NilClass
    test/controllers/sessions_controller_test.rb:7:in `block in <class:SessionsControllerTest>'

为什么不起作用?我做错了什么?

我在 test/test_helper.rb 中添加 include Devise::TestHelpers 后错误消失了,因为 documentation 建议:

class ActiveSupport::TestCase
  ...
  include Devise::TestHelpers
end

现在我的测试是这样的:

test/controllers/sessions_controller_test.rb:

require 'test_helper'

class Devise::SessionsControllerTest < ActionController::TestCase
  test "should have login field" do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    get :new
    assert_select '[name="user[login]"]'
  end

  test "should sign in using login" do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    post :create, user: {login: 'login', password: 'password'}
    assert_redirected_to root_url
  end
end

test/fixtures/users.yml (how to put password in a fixture):

one:
    login: login
    encrypted_password: <%= Devise.bcrypt(User, 'password') %>