测试失败:预期响应为 <redirect>,但为 <200>

Test failure: Expected response to be a <redirect>, but was <200>

我是 rails 的新手,开始设置我的第一个测试套件。

在我的测试中,我不断遇到以下故障:

Expected response to be a <redirect>, but was <200>

此响应很奇怪,因为在使用浏览器进行测试时重定向显然有效。有谁知道这里会发生什么,或者诊断此类问题的最佳方法是什么。比如有没有办法查到200消息是在哪个页面给出的

测试脚本(user_controller_test.rb)

test "when correct should redirect to dashboard" do
    log_in_as(@user_one)
    assert_redirected_to dashboard_url
end 

完整的控制台消息

 FAIL["test_should_get_dashboard_when_correct_user", UsersControllerTest, 2015-12-23 18:06:20 +1100]
 test_should_get_dashboard_when_correct_user#UsersControllerTest (1450854380.57s)
Expected response to be a <redirect>, but was <200>
test/controllers/users_controller_test.rb:27:in `block in <class:UsersControllerTest>'

控制器:

class SessionsController < ApplicationController

def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])

          log_in user         
          params[:session][:remember_me] == '1' ? remember(user) : forget(user)
          redirect_back_or dashboard
     else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new' 
    end
  end

你的测试有误。

控制器中的代码是这样的:

if user && user.authenticate(params[:session][:password])
  redirect_back_or dashboard
else
  render 'new' 
end

# if user is not nil AND user can authenticate with given params
  # success (redirect)
# else the params passed to the controller did not authenticate the user
  # fail (render 200)

然后你的测试说:

log_in_as(@user_one)
assert_redirected_to dashboard_url

# login user manually, rather than assign params
# check if the controller action redirected, meaning check if it could authenticate with the given params that you did not assign

看到问题了吗?如果您希望它通过 if 语句,您需要设置控制器操作正在检查的参数。