rspec - 在测试中始终以状态200响应

时间:2018-05-16 01:07:43

标签: ruby-on-rails rspec

我有一个用户控制器,当发送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

1 个答案:

答案 0 :(得分:2)

这是因为您正在控制器中以字符串形式测试哈希键...

if params[:user].has_key?("current_password")

但是在测试中以符号形式传递它们......

user: {
            current_password: "incorrect1235",

如果在这种情况下查看控制器中的参数,您会发现密钥是:

:current_password

这也指出了代码中的一个危险缺陷 - 如果" current_password"可以更新用户的密码。更新参数中未提供。在这种情况下,始终调用else块,并且永远不会对用户进行身份验证。

建议测试current_password的存在,如果没有提供,则返回错误。