rspe c - Как проверить ActiveRecord :: RecordNotFound? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть метод обновления атрибутов людей, и он спасет ActiveRecord::RecordNotFound, если людей не найдут. Метод:

  def update
    @people= People.find(params[:id])
    if @people.update(people_params)
      render json: { success: 'Success' }
    else
      render :edit
    end
  rescue ActiveRecord::RecordNotFound => e
    render json: { error: 'Failed') }
  end

И я хочу проверить ситуацию, когда запись не найдена, вот мой тест на данный момент:

    let(:people) { create(:people) }
    let(:people_id) { people.id }
    let(:user) { people}
    # Other tests...
    context 'when person not found' do
      let(:exception) { ActiveRecord::RecordNotFound }

      # What should I write so that I can let the record not been found?

      before { allow(People).to receive(:find).and_raise(exception) }

      it 'responds with json containing the error message' do
        expect(JSON.parse(response.body)).to eq({error:'Error'})
      end
    end

Я хочу, чтобы мой тест был выполнен при условии, что записи не найдены. Но я не знаю, как это сделать. Я пытался установить let(people) {nil}, но это не сработало. Есть ли способ сделать это? Спасибо!

1 Ответ

0 голосов
/ 11 апреля 2020

Это не очень хорошее решение для начала. В Rails вы хотите использовать rescue_from для обработки распространенных ошибок на уровне контроллера.

class ApplicationController
  rescue_from ActiveRecord::RecordNotFound, with: :not_found

  def not_found
    respond_to do |format|
      format.json { head :404 }
    end
  end
end

Это позволяет вам использовать наследование DRY вашего кода.

render json: { error: 'Failed') }

Является ли огромный анти-паттерн. Если запрос не прошел, вы должны сообщить об этом клиенту, отправив правильный код состояния HTTP. Не изобретай велосипед. Особенно, если ваше решение - квадратное колесо. Если ваш JS использует обезьяны с ответом json, чтобы увидеть, был ли запрос успешным или нет, вы делаете его неправильно.

Если вы хотите проверить, что ваш контроллер обрабатывает отсутствующий ресурс правильно вы бы сделали:

let(:people) { create(:people) }
let(:people_id) { people.id }
let(:user) { people}

it "returns the correct response code if the person cannot be found" do
  get '/people/notarealid'
  expect(response).to have_http_status :not_found
end

Это не использует заглушки и фактически проверяет реализацию.

...