rspec - всегда отвечает со статусом 200 в тестах - PullRequest
0 голосов
/ 16 мая 2018

У меня есть пользовательский контроллер, который при отправке запроса PATCH будет пытаться аутентифицировать пользователя и обновлять пароль пользователя.Все работает в браузере (я получаю 200, когда «current_password» верен, и 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 голосов
/ 16 мая 2018

Это потому, что вы проверяете ключи хеша в строковой форме в контроллере ...

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

но передавая их в виде символа в тесте ...

user: {
            current_password: "incorrect1235",

Если вы посмотрите на параметры в контроллере в этом случае, вы найдете ключ:

:current_password

Это также указывает на опасный недостаток в вашем коде - пароль пользователя может быть обновлен, если «current_password» не указан в параметрах обновления. В этом случае всегда вызывается блок else, а пользователь никогда не аутентифицируется.

Предложить проверить наличие current_password и вернуть ошибку, если она не указана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...