Rails 教程 - 错误消息:预期响应为 <redirect>,但为 <200>

Rails Tutorial - ERROR MESSAGE: expected response to be a <redirect>, but was <200>

"Listing 8.20: A test for user logging in with valid information" 中的测试给我一个持续的错误消息:

 FAIL["test_login_with_valid_information", UsersLoginTest, 1.051300315]
 test_login_with_valid_information#UsersLoginTest (1.05s)
 Expected response to be a <redirect>, but was <200>
 test/integration/users_login_test.rb:22:in `block in <class:UsersLoginTest>'

测试是:

19   test "login with valid information" do
20    get login_path
21    post login_path, session: { email: @user.email, password: 'password' }
22    assert_redirected_to @user
23    follow_redirect!
24    assert_template 'users/show'
25    ....

会话控制器是我想象的导致此错误消息的原因

def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    log_in user
    redirect_to user  # What I want to happen
  else
    flash.now[:danger] = 'Invalid email/password combination'
    render 'new'      # What is happening
  end
end

如果用户通过身份验证,它应该重定向到用户个人资料页面 否则登录表单将 render

所以我认为问题是我的测试用户没有经过身份验证。当我在站点上手动登录时,应用程序登录和重定向功能正常。

test/fixtures/users.yml有这个传密码'password'

   password_digest: <%= User.digest('password') %>

并且用户模型有这个来消化密码 'password'

 def User.digest(string)
  cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                              BCrypt::Engine.cost
  BCrypt::Password.create(string, cost: cost)
 end

问题出在哪里?以及如何进行另一项测试以说明此测试失败的原因?

睡了一夜好觉后,我意识到这可能是由于数据库错误。瞧,我的数据库有一封大写的电子邮件,而我的控制器提交了一封小写的电子邮件。

已解决。

如果我没看错的话,我有一个类似的(相同的)问题,为了未来浏览器的清晰起见,我将添加以下内容:正如 Shonin 所指出的,这个问题与控制器采用 downcase 有关电子邮件地址,显然在 users.yml 代码

michael:
  name: Michael Example
  email: Michael@example.com
  password_digest: <%= User.digest('password') %>

不会通过

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

会过去的。