预期的响应是<redirect>,但是<200>

Opy*_*egs 5 ruby-on-rails minitest ruby-on-rails-4

我正在尝试在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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

zet*_*tic 11

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

至于它失败的原因,目前还不清楚.测试出现混淆的值@user控制器,具有的值@user测试,这是两种完全不同的对象.

在测试操作时,您可以通过params散列传递值,如上所述:

post users_path, user: @user.attributes
Run Code Online (Sandbox Code Playgroud)

但是测试然后@user再次设定价值,没有充分的理由.我不清楚@user(原始值)(测试中的那个)的原始值在哪里得到它的属性.

你可能想做这样的事情:

 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
Run Code Online (Sandbox Code Playgroud)

局部变量user只是生成属性哈希值的便利.您可以轻松地将属性直接分配给哈希并将其传递给post.