🐷

OpenAPI からモックデータを生成して Jest する

2023/03/09に公開

やったこと

swagger-parser を使って openapi.yaml を読み込み、exmaple をモックデータとして使って Jest を実行できるようにした

具体的な手順

@apidevtools/swagger-parser をインストール

npm install -D @apidevtools/swagger-parser

setup ファイルで beforeAll を使うために、jest.config.js を修正

// jest.config.js
module.exports = {
  ...
  // setupFiles: ['./setup.js'], ← before
  setupFilesAfterEnv: ['./setup.js'], // ← after
}

setup ファイルで、OpenAPI からデータを取得

/// setup.js
...
import SwaggerParser from '@apidevtools/swagger-parser'
const OPENAPI_PATH = '../backend/doc/openapi.yaml'

beforeAll(async () => {
  // $ref を解消して openapi を取得
  const openapi = await SwaggerParser.dereference(OPENAPI_PATH)

  // モックデータを取得するための関数
  const mockResponse = ({ path, method, status }) => {
    return openapi.paths[path][method].responses[status].content[
      'application/json'
    ].example
  }

  // global に渡す
  global.mockResponse = mockResponse
})
...

test ファイルで取得する

// sample.spec.js
...

beforeEach(() => {
  // eslint-disable-next-line no-undef
  sampleBooks = mockResponse({
    path: '/api/v1/books',
    method: 'get',
    status: '200',   
  }).data
  // => ex) [{ id: 1, title: 'Sample Book1' }]
})
...

まとめ

最高

参考記事

https://github.com/APIDevTools/swagger-parser
https://blog.magcho.com/2022/9/openapi-validation-test/
https://stackoverflow.com/questions/66056282/typescript-with-jest-referenceerror-beforeall-is-not-defined

Discussion