我尝试在用户控制器中测试创建操作,其中用户是使用配置文件创建的;然后用户被重定向到用户的个人资料页面,但我收到错误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
答案 0 :(得分:11)
错误消息表示创建操作失败,而不是重定向到用户的配置文件(状态 302 ),它再次呈现表单(状态 200 )
至于为什么它失败了,目前还不清楚。该测试似乎会混淆控制器中@user
的值与 test 中@user
的值混淆,后者是两个完全不同的对象
测试操作时,您可以通过params哈希传递值,如上所述:
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
。
答案 1 :(得分:2)
当我为我的页面上的一个输入设置了最小长度约束时,我遇到了这个错误,然后自动生成的测试尝试了一个用户密码,这个密码太短了我的约束。 因此,请检查您是否对您正在测试的网页上的任何字段设置了任何限制。 在我的例子中,我的用户页面上的密码字段在models文件夹的user.rb文件中有以下约束:
validates :password, length: { minimum: 8 }
但随后自动生成的测试代码使用了6个字符的密码&#39; secret&#39 ;,然后失败了该要求并生成了此错误。 当我在运行的网站上手动输入相同的测试数据时,我才意识到这一点,所以这是另一个很好的备份计划,如果第一次测试没有想到的话。
答案 2 :(得分:-1)
在每个控制器文件中登录测试文件 def设置 @user = users(:user) log_in_as(@user) 端