Rspe c для метода удаления - PullRequest
0 голосов
/ 09 марта 2020

Я пишу спецификации для методов удаления, использующих rspe c в рельсах. Мой метод такой:

   def destroy
     if @user.destroy
       json_response Hash({message: 'Successfully deleted'})
     elsif @user.present?
       json_response @user.errors.full_messages, :unprocessable_entity
     else
       json_response ["You can't delete it as it has been already deleted"], :unprocessable_entity
   end

Мои спецификации такие же, и теперь я хочу добавить условие else.

describe "DELETE#destroy" do

it "Delete requeted user" do
  user = User.create! valid_attributes
  delete :destroy, params: {use_route: 'api/v1/', id: user.to_param}, format: :json
  return_response = JSON.parse(response.body)
  expect(return_response["message"]).to eq "Successfully deleted"
  expect(response).to have_http_status(200)
end

it "Can't delete the user as it's already deleted" do
  user = User.create! valid_attributes
  delete :destroy, params: {use_route: 'api/v1/', id: user.to_param}, format: :json
  delete :destroy, params: {use_route: 'api/v1/', id: user.to_param}, format: :json

  return_response = JSON.parse(response.body)

  expect(return_response[0]).to eq "You can't delete it as it has been already deleted"
  expect(response).to have_http_status(422)
end

end

Когда я запускаю спецификации работает нормально. Но когда я вижу покрытие, оно не покрывает эти условия:

elsif @user.present?
       json_response @user.errors.full_messages, :unprocessable_entity

Может кто-нибудь, пожалуйста, посмотрите на это.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

У вас есть

delete :destroy, params: { id: '' }, format: :json

Это должно быть

delete :destroy, params: { id: user }, format: :json

Вот почему ваш User не найден в контроллере.

0 голосов
/ 10 марта 2020

Похоже, ваш контроллер делает именно то, что я ожидаю. Я предполагаю, что вы устанавливаете @user, используя User.find(params[:id]). Это заставит контроллер возвращать ошибку :not_found независимо от того, какой ввод вы вводите для идентификатора, если он не является действительным идентификатором. Я думаю, что вы хотите проверить это блок else, который возвращает ошибки. Для этого вам нужно как-то принудительно завершить операцию destroy. Не видя вашей пользовательской модели, трудно сказать, действительно ли возможно, что метод destroy не был успешным.

...