【Rails】committee-railsとRSpecでOpenAPIのスキーマチェックをする方法

committee-railsというgemを使って、RSpecでのテスト時にAPIの実装がOpenAPIの定義と一致しているか確認する方法を、備忘録としてまとめます。

バージョン

  • Ruby 3.2.2
  • Rails 7.1.2

記事の信頼性

  • ぼくは独学で未経験から従業員300名以上の自社開発企業へ転職しました。
  • 実務ではVue.jsとRailsを毎日書いています。
  • 初心者や駆け出しエンジニアがつまづくポイントも身をもってよく理解しています。

※この記事では、すでにRSpecは導入していることを前提に話を進めます。

目次

committee-railsとRSpecでOpenAPIのスキーマチェックをする方法

RSpecでOpenAPIで定義したスキーマとのチェックをする手順は次のとおりです。

  1. committee-railsというgemのインストール
  2. RSpecでスキーマチェックをするための記述を追加
  3. スキーマチェックのためのテストを書く

順番に説明します。

1. committee-railsというgemのインストール

まずはcommittee-railsというgemをインストールします。

Gemfileに記述を追加したら、bundle installを実行しましょう。

group :development, :test do
  gem 'committee-rails', '~> 0.8.0'
end

2. RSpecでスキーマチェックをするための記述を追加

次にRSpecでOpenAPIの定義と実装が一致しているかを確認するための設定を追加します。

spec/rails_helper.rbの末尾に次のように書いてください。

RSpec.configure do |config|
  # 他の設定は省略します

  # OpenAPIのスキーマチェックを行う
  config.include Committee::Rails::Test::Methods
  config.add_setting :committee_options
  config.committee_options = {
    # API定義ファイルのパスを指定する
    schema_path: Rails.root.join('docs/openapi/openapi.yaml'),
    strict_reference_validation: true,
  }
end

3. スキーマチェックのためのテストを書く

これで設定は完了、あとはテストを書くだけです。

今回はTODOの一覧を取得するAPIのテストを想定し、話を進めます。

class Api::V1::TodosController < ApplicationController
  def index
    @todos = Todo.all.order(:id)
    render json: { todos: @todos }
  end
end

RSpecのテストコードは次のようになります。

require 'rails_helper'

RSpec.describe "Api::V1::Todos", type: :request do
  describe "GET /index" do
    it "returns http success" do
      get "/api/v1/todos"
      expect(response).to have_http_status(:success)
    end

    it "returns a list of todos" do
      todo = Todo.create(title: "Test Todo", done: false)
      get "/api/v1/todos"
      expect(response).to have_http_status(:success)
      expect(response.body).to include(todo.title)
    end

    it "returns a list of todos in the correct order" do
      todo1 = Todo.create(title: "Test Todo 1", done: false)
      todo2 = Todo.create(title: "Test Todo 2", done: false)
      get "/api/v1/todos"
      expect(response).to have_http_status(:success)
      expect(response.body).to include(todo1.title)
      expect(response.body).to include(todo2.title)
      expect(response.body.index(todo1.title)).to be < response.body.index(todo2.title)
    end

    # リクエストがOpenAPI定義に準拠しているかテスト
    it 'conforms to request schema' do
      get '/api/v1/todos'
      assert_request_schema_confirm
    end

    # レスポンスがOpenAPI定義に準拠しているかテスト
    it 'conforms to response schema with 200 response code' do
      get '/api/v1/todos'
      assert_response_schema_confirm(200)
    end
  end
end

下の2つがOpenAPIの定義と一致しているかを確認するテストです。

assert_request_schema_confirmassert_response_schema_confirm(200)committee-railsが用意してくれているメソッドなので、これを使いましょう。

おわりに

業務ではドキュメントのメンテが後手に回り、実装と乖離してしまうケースが多々あります。

OpenAPIを用いて今回のようにスキーマ駆動開発で進めることで、こういった問題を解消できると感じました。

参考文献

Railsエンジニアにおすすめの記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

未経験でSESから従業員300名以上の自社開発企業に転職しました。業務や個人開発で直面した問題や、転職・学習の経験を発信していきます。

コメント

コメントする

目次