我有一个用户控制器,当发送PATCH请求时,它会尝试对用户进行身份验证并更新用户的密码。一切都在浏览器中工作(当#34; current_password"正确时我得到200,而当它不正确时我得到401。)
但是当我尝试运行规范时,expect(response.status).to eq(401)
总是失败,因为我总是得到200作为回复,有人可以解释这里发生了什么吗?
users_controller.rb:
def update
if params[:user].has_key?("current_password") && !(@user.authenticate(params[:user][:current_password]))
render_response(:not_authorized, { description_detailed: "Unable to authenticate current password" })
else
@user.update_attributes!(accessible_params)
render_response(:ok, { data: UserSerializer.new(@user, root: false)})
end
end
users_controller_spec.rb:
context "when current password field is passed in" do
let(:name) { Faker::HarryPotter.character.split(' ') }
let!(:custom_user) do
create(:user,
first_name: name[0],
last_name: name[0],
email: "test@reset.com",
password: "correct123"
)
end
context "when current password is correct" do
before :example do
patch :update, params: { id: custom_user.id, user: user_params }
end
let(:user_params) do
{ current_password: "correct123", password: "newpassword123" }
end
it "updates user's password with new password" do
expect(custom_user.authenticate('correct123')).to eq(custom_user)
expect(response.status).to eq(200)
end
end
context "when current password is incorrect" do
let(:user_params) do
{ user: {
current_password: "incorrect1235",
password: "newpassword123"
}}
end
before :example do
patch :update, params: { id: custom_user.id, user: user_params }
end
it "does not update user's password" do
expect(custom_user.authenticate('incorrect1234')).not_to eq(custom_user)
expect(response.status).to eq(401)
end
end
end
答案 0 :(得分:2)
这是因为您正在控制器中以字符串形式测试哈希键...
if params[:user].has_key?("current_password")
但是在测试中以符号形式传递它们......
user: {
current_password: "incorrect1235",
如果在这种情况下查看控制器中的参数,您会发现密钥是:
:current_password
这也指出了代码中的一个危险缺陷 - 如果" current_password"可以更新用户的密码。更新参数中未提供。在这种情况下,始终调用else块,并且永远不会对用户进行身份验证。
建议测试current_password的存在,如果没有提供,则返回错误。