【问题标题】:How to determine why a patch request in a test is unsuccessful如何确定测试中的补丁请求失败的原因
【发布时间】:2015-05-01 21:02:58
【问题描述】:

在测试中我有一个patch request。但是,它不保存。我知道这一点是因为在patch request 之后我会测试新值是否存在。

如何辨别测试中的patch request 失败的原因?

补丁请求:

fullname = "MyName"
phone = "MyPhone"
patch member_path(@user), member: { phone: phone,
                                   fullname: fullname,
                                   password: "",
                                   password_confirmation: "" }
puts @response.message
puts @response.status
assert flash[:success]
assert_redirected_to @user
@user.reload
assert_equal @user.fullname, fullname
Etc.

我查看了test.log,但从那里我不明白为什么补丁请求不保存新值。

测试日志:

Started PATCH "/members/980190962" for 127.0.0.1 at 2015-05-01 21:26:59 +0000
Processing by MembersController#update as HTML
  Parameters: {"member"=>{"phone"=>"MyPhone", "fullname"=>"MyName", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "id"=>"980190962"}
...
  [1m[35m (0.1ms)[0m  SAVEPOINT active_record_1
  [1m[36mMember Exists (0.2ms)[0m  [1mSELECT  1 AS one FROM "members" WHERE (LOWER("members"."email") = LOWER('orgone@example.com') AND "members"."id" != 980190962) LIMIT 1[0m
  [1m[35mMember Exists (0.2ms)[0m  SELECT  1 AS one FROM "members" WHERE (LOWER("members"."username") = LOWER('myst1') AND "members"."id" != 980190962) LIMIT 1
  [1m[36m (0.1ms)[0m  [1mROLLBACK TO SAVEPOINT active_record_1[0m
  Rendered shared/_error_messages.html.erb (1.7ms)
...

我还在补丁行之后将@response.status@response.message 添加到测试中。但是这些不会产生任何额外的输出,所以我仍然不明白为什么 patch request 不成功(它确实在开发中工作)。

控制器中的更新方法:

  def update
    @member = Member.find(params[:id])
    if @member.update_attributes(memberupdate_params)
      flash[:success] = "Profile updated"
      redirect_to @member
    else
      render 'edit'
    end
  end

private
def memberupdate_params
  if ((current_member && current_member.admin?)
    params.require(:member).permit( :email,
                                    :username,
                                    :fullname,
                                    :phone,
                                    :admin,
                                    :password,
                                    :password_confirmation)
  else
    params.require(:member).permit( :email,
                                    :username,
                                    :fullname,
                                    :phone,
                                    :password,
                                    :password_confirmation)
  end
end

【问题讨论】:

  • 我认为您只需要在测试全名之前重新加载用户。 @user.reload。它可能正在更新,但您的测试中仍然加载了它的过时副本。
  • 对不起,我只贴了几行。在实际测试中我重新加载,所以不是这样。我已将这些行添加到我的原始帖子中。
  • 检查log/test.log文件的内容。
  • 谢谢,我无法从 test.log 中了解错误的原因是什么。我已将其添加到我的原始帖子中。
  • 从日志中可以明显看出您尝试创建的 Member 记录已经存在。

标签: ruby-on-rails ruby ruby-on-rails-4 integration-testing


【解决方案1】:

您的测试日志 SQL 在这里看起来有问题:

"members"."id" != 980190962

我的预期正好相反:

"members"."id" = 980190962

您确定您的开发环境和测试环境使用相同的 gem 版本、相同的 Rails 版本等吗?

一般来说,Rails update 将被包装在事务中。失败的常见原因是验证错误。请参阅validate! 方法了解如何验证,并查看模型类以了解您是否需要任何特殊验证。

您可能想暂时尝试一个简单的代码更改,以查看 Rails 是否引发异常。

改变这个区域:

if @member.update_attributes(memberupdate_params)
  ...

到这个bang方法:

@member.update_attributes!(memberupdate_params)

【讨论】:

  • 这很聪明,通过使用“bang 方法”临时更改它,终端中会出现一条明确的错误消息,让我能够找出发生了什么。结果发现,fixtures 中用户的用户名没有通过验证(短 1 个字符)。
猜你喜欢
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2020-08-28
  • 2018-08-05
相关资源
最近更新 更多