预期响应为 <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',导致无法满足要求并产生此错误。
当我在我的 运行 网站上手动输入相同的测试数据时,我才意识到这一点,所以如果第一次测试没有想到什么,这是另一个很好的备份计划。
我正在尝试在使用配置文件创建用户的 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',导致无法满足要求并产生此错误。 当我在我的 运行 网站上手动输入相同的测试数据时,我才意识到这一点,所以如果第一次测试没有想到什么,这是另一个很好的备份计划。