预期响应为 <redirect>,但为 <200>

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

我正在尝试在使用配置文件创建用户的 UsersController 中测试创建操作;然后用户被重定向到用户的个人资料页面,但我收到错误 Expected response to be a <redirect>, but was <200>.

在用户控制器中创建动作

def create
  @user = User.new(user_params)
  if @user.save
    log_in @user
    flash[:success] = "Welcome to the Mini Olympics"
    redirect_to user_profile_path(current_user, @profile)
  else
    render 'new'
  end
end

使用有效信息进行注册测试

test "valid signup information" do
  get signup_path
  assert_difference 'User.count', 1 do
    post users_path, user: @user.attributes
    @user.build_profile(name: "Micheal Example", street: "24 Martins St.", city: "Waterloo", state: "AW", zipcode: "22456")
    @user.save
    #assert_redirected_to user_profile_path(@user)
    assert_redirected_to @user.profile
  end
  assert_template 'profiles/show'
  assert is_logged_in?
end

错误消息表示创建操作失败,它没有重定向到用户的配置文件(状态 302),而是再次呈现表单(状态 200).

至于为什么失败,不清楚。测试似乎混淆了 controller 中的 @user 值与 test 中的 @user 值,这是两个完全不同的对象。

测试动作时,您通过参数散列传递值,就像您在上面的行中所做的那样:

post users_path, user: @user.attributes

但是测试随后无缘无故地再次设置了 @user 的值。我不清楚 @user 的原始值(test 中的那个)从哪里获得它的属性。

你可能想做这样的事情:

 assert_difference 'User.count', 1 do
   user = User.new
   user.build_profile(name: "Micheal Example", street: "24 Martins St.", city: "Waterloo", state: "AW", zipcode: "22456")
   post users_path, user: user.attributes
   assert_redirected_to user.profile
 end

局部变量user只是为了方便生成属性散列的值。您可以轻松地将属性直接分配给散列并将它们传递给 post.

在测试文件中的每个控制器文件中登录 定义设置 @用户=用户(:用户) log_in_as(@用户) 结束

当我为页面上的其中一个输入设置最小长度限制时出现此错误,然后自动生成的测试尝试了一个用户密码,该密码太短了我的限制。 因此,也许检查您是否对正在测试的页面上的任何字段设置了任何限制。 就我而言,我的用户页面上的密码字段在模型文件夹中的 user.rb 文件中具有以下约束:

    validates :password, length: { minimum: 8 }

但是自动生成的测试代码使用了6个字符的密码'secret',导致无法满足要求并产生此错误。 当我在我的 运行 网站上手动输入相同的测试数据时,我才意识到这一点,所以如果第一次测试没有想到什么,这是另一个很好的备份计划。