⚡
committee-railsで読み込むOpen APIのスキーマを切り替える
そこまでめんどくさいことしなくていい気がしたのでやってみた。
やる
Committee::Rails::Test::Methods は Committee::Test::Methods になんかメソッドかぶせてるやつで、committee_options についてはデフォルト値をセットする or RSpec config を読んできてるだけみたい。
本体である Committee::Test::Methods はいろいろあるけど schema 経由で利用するスキーマを選んでいる。なので、schemaをハックしてやる。
RSpec.configure do |config|
# あとで committee_options とか schema を置き換えるために先に include する
include ::Committee::Rails::Test::Methods
config.before(:each, type: :request) do |example|
if # example で判定してやる
@schema_variant = 'schema.release.yml'
else
@schema_variant = 'schema.debug.yml'
end
end
# RSpec.config でやるのではなくメソッドを書くことで @schema_variant によって置き換わるように調整
def committee_options
{
schema_path: Rails.root.join("path/to/schemadir", @schema_variant).to_s,
prefix: '/v1',
parse_response_by_content_type: false
}
end
# Committee 本体は1行コードでキャッシュしてるので、こっちも @schema_variant によってキャッシュしてやる
def schema
@schemas ||= {}
@schemas[@schema_variant] ||= Committee::Middleware::Base.get_schema(committee_options)
end
end
RSpec の configure がそのままテストで使われるのでこれで動くけどバージョンとかによっては死ぬのかもしれない。手元のプロジェクトではうまく動いたので良しとする。
感想
Committee::Test::Methods の schema とか router だけど、名前被って事故りそうだなって思った。rubyのモジュール周りの細かい挙動しらないんだけど、モジュール同士で相互に上書きのリスクあるよね……?ないのかな。
Discussion