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で定義したスキーマとのチェックをする手順は次のとおりです。
committee-rails
というgemのインストール- RSpecでスキーマチェックをするための記述を追加
- スキーマチェックのためのテストを書く
順番に説明します。
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_confirm
とassert_response_schema_confirm(200)
はcommittee-rails
が用意してくれているメソッドなので、これを使いましょう。
おわりに
業務ではドキュメントのメンテが後手に回り、実装と乖離してしまうケースが多々あります。
OpenAPIを用いて今回のようにスキーマ駆動開発で進めることで、こういった問題を解消できると感じました。
コメント