预期的响应是<重定向>,但是<200>。

时间:2015-09-03 22:56:41

标签: ruby-on-rails ruby-on-rails-4 minitest

我尝试在用户控制器中测试创建操作,其中用户是使用配置文件创建的;然后用户被重定向到用户的个人资料页面,但我收到错误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

3 个答案:

答案 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)      端