如何确定测试中的补丁请求不成功的原因
How to determine why a patch request in a test is unsuccessful
在测试中我有一个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
,但也从那里我不明白为什么补丁请求不保存新值。
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
你的测试日志 SQL 在这里看起来是错误的:
"members"."id" != 980190962
我希望相反:
"members"."id" = 980190962
您确定您的开发环境和测试环境使用相同的 gem 版本、相同的 Rails 版本等吗?
大体上,Rails update
将包含在交易中。失败的常见原因是验证错误。请参阅 validate!
方法了解如何验证,并查看模型 class 以查看您是否需要任何特殊验证。
您可能想暂时尝试简单的代码更改,看看 Rails 是否会引发异常。
更改此区域:
if @member.update_attributes(memberupdate_params)
...
这个刘海方法:
@member.update_attributes!(memberupdate_params)
在测试中我有一个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
,但也从那里我不明白为什么补丁请求不保存新值。
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
你的测试日志 SQL 在这里看起来是错误的:
"members"."id" != 980190962
我希望相反:
"members"."id" = 980190962
您确定您的开发环境和测试环境使用相同的 gem 版本、相同的 Rails 版本等吗?
大体上,Rails update
将包含在交易中。失败的常见原因是验证错误。请参阅 validate!
方法了解如何验证,并查看模型 class 以查看您是否需要任何特殊验证。
您可能想暂时尝试简单的代码更改,看看 Rails 是否会引发异常。
更改此区域:
if @member.update_attributes(memberupdate_params)
...
这个刘海方法:
@member.update_attributes!(memberupdate_params)