Как вы обрабатываете плохие запросы с помощью тестов RSpec в Rails? - PullRequest
0 голосов
/ 22 декабря 2019

В моей тестовой базе данных у меня есть отзывы, к которым я обращаюсь к API в моем приложении Rails 5 только для API.

Пока я написал тесты для своего индекса и покажу действия для ReviewsController.

Как мне обработать ошибку / неверный запрос? Например, если кто-то пытается перейти на несуществующий маршрут или если кто-то пытается перейти на маршрут показа без существующего идентификатора, как это делается в RSpec?

# spec/controllers/api/v1/reviews_controller_spec.rb
require 'rails_helper'

RSpec.describe Api::V1::ReviewsController do
  describe "GET #index" do
    before do
      get :index
    end

    it "returns HTTP Success" do
      expect(response).to have_http_status(:success)
    end

    it "JSON body response contains expected review attributes" do
      json_response = JSON.parse(response.body)
      json_response["status"].should == "SUCCESS"
    end
  end

  describe "GET #show" do
    before do
      get :show, params: { id: 1 }
    end

    it "returns HTTP Success" do
      expect(response).to have_http_status(:success)
    end

    it "JSON body response contains expected review attributes" do
      json_response = JSON.parse(response.body)
      json_response["status"].should == "SUCCESS"
    end
  end
end

ReviewsController:

# spec/controllers/api/v1/reviews_controller.rb
module Api
  module V1
    class ReviewsController < ApplicationController
      def index
        @reviews = Review.order(created_at: :desc)
        render json: { status: 'SUCCESS', message: 'loaded reviews', data: @reviews }
      end

      def show
        @review = Review.find(params[:id])
        render json: { status: 'SUCCESS', message: 'loaded the review', data: @review }
      end

      private

      def review_params
        params.require(:review).permit(:title, :star, :content, :name, :date)
      end
    end
  end
end

1 Ответ

1 голос
/ 22 декабря 2019

В тесте контроллера вы можете указать, что контроллер поднимает ActiveRecord::RecordNotFound, когда id не существует.

describe "GET #show" do
  context "with a valid id" do
    before do
      get :show, params: { id: 1 }
    end

    it "returns HTTP Success" do
      expect(response).to have_http_status(:success)
    end

    it "JSON body response contains expected review attributes" do
      json_response = JSON.parse(response.body)
      json_response["status"].should == "SUCCESS"
    end
  end

  context "with an invalid id" do
    it "raises an error" do
      expect { 
        get :show, params: { id: "invalid-identifier" }
      }.to raise_error ActiveRecord::RecordNotFound
    end
  end
end

Обратите внимание, что когда контроллер поднимает ActiveRecord::RecordNotFound in production, то Ruby on Rails вернет 404 (not found) - если значение по умолчанию не было изменено. Подробнее об этом поведении читайте в Rails Guides .

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