Techioz Blog

特定のファイル内のパスを実行する方法、または特定のパスのみを実行して rswag で Swagger をテストする方法

概要

オープン API ドキュメントを生成するために、rswag を使用して多くの API 呼び出しが定義されているプロジェクトがあります。 このプロジェクトでは、エンドポイント パスを別の Ruby ファイルに分類しました。

私の質問は、Swagger を生成するために新しいエンドポイントの新しいパスを追加するとき、ドキュメントが正しいか間違っているかをテストするためにすべてのファイルとパスを実行する必要があるのか、それとも特定のパスを実行できる方法はあるのかということです(例) またはファイルを使用して、新しく追加した API サンプルのみをテストします。

次の例を見てみましょう。rswag github 用にコピーして修正しました。

# spec/requests/blogs_spec.rb
require 'swagger_helper'

describe 'Blogs API' do

  path '/blogs' do

    post 'Creates a blog' do
      tags 'Blogs'
      consumes 'application/json'
      parameter name: :blog, in: :body, schema: {
        type: :object,
        properties: {
          title: { type: :string },
          content: { type: :string }
        },
        required: [ 'title', 'content' ]
      }

      response '201', 'blog created' do
        let(:blog) { { title: 'foo', content: 'bar' } }
        run_test! do
             // some logics
        end
      end

      response '422', 'invalid request' do
        let(:blog) { { title: 'foo' } }
        run_test! do
             // some logics
        end
      end
    end
  end

  path '/blogs/{id}' do

    get 'Retrieves a blog' do
      tags 'Blogs', 'Another Tag'
      produces 'application/json', 'application/xml'
      parameter name: :id, in: :path, type: :string
      request_body_example value: { some_field: 'Foo' }, name: 'basic', summary: 'Request example description'

      response '200', 'blog found' do
        schema type: :object,
          properties: {
            id: { type: :integer },
            title: { type: :string },
            content: { type: :string }
          },
          required: [ 'id', 'title', 'content' ]

        let(:id) { Blog.create(title: 'foo', content: 'bar').id }
        run_test! do
             // some logics
        end
      end

      response '404', 'blog not found' do
        let(:id) { 'invalid' }
        run_test! do
             // some logics
        end
      end

      response '406', 'unsupported accept header' do
        let(:'Accept') { 'application/foo' }
        run_test! do
             // some logics
        end
      end
    end
  end
end

テストのみを実行する必要があります。 いくつかのタグを含むブログパスを作成します。必要な場合、この仕様ファイルのどこにこのタグを追加すればよいですか?

rswagのドキュメントで次のことを見つけました。しかし、このタグをどこに追加すればよいのかわかりません。

# Only include tests tagged "rswag"
rake rswag:specs:swaggerize ADDITIONAL_RSPEC_OPTS="--tag rswag"

現在、次のコマンドを使用して docker-compose ファイル上でこれを実行しています。このコマンドを更新しても問題ありません。

bundle exec rake rswag:specs:swaggerize

助けていただければ幸いです。

解決策

:tag オプションを使用して、RSpec テストにタグを追加できます。あなたの場合、実行したい特定のテストに rswag タグを追加できます。その方法は次のとおりです。

post 'Creates a blog', :rswag do
  # ...
end

この例では、:rswag タグが「ブログの作成」テストに追加されます。ここで、コマンド rake rswag:specs:swaggerize ADDITIONAL_RSPEC_OPTS=“–tag rswag” を実行すると、rswag タグを持つテストのみが実行されます。