如何让rspec-swag生成带Sinatra路由前缀的Swagger绝对路径
环境配置
# Gemfile gem 'rspec-swag' # config.ru map '/orders' do run Web::OrdersApp end map '/admin/orders' do run Web::AdminOrdersApp end # rspec describe OrdersApp, :vcr, type: :request do let(:described_class) { OrdersApp } path '/index' do get '' do .... end end end
问题描述
rspec-swag生成的文档仅展示*/index路径,忽略了config.ru中配置的map路由前缀,导致无法通过Swagger网页UI测试API。需要在文档中生成/orders/index*这类完整绝对路径。
请告知如何修改代码以生成可用的Swagger文档?
解决方法
有两种靠谱的方式可以让rspec-swag识别路由前缀:
1. 单测试用例手动指定base path
在对应的describe块里添加swagger_base_path配置,直接把路由前缀加上:
describe OrdersApp, :vcr, type: :request do let(:described_class) { OrdersApp } # 给当前测试指定base path为/orders let(:swagger_base_path) { '/orders' } path '/index' do get '' do # ... 你的测试逻辑 end end end
针对AdminOrdersApp的测试,同理把swagger_base_path设为'/admin/orders'就行。
2. 全局统一配置(适合多路由场景)
如果有多个类似的路由前缀需要处理,直接在spec_helper.rb里加全局配置,根据测试类自动匹配对应前缀:
# spec_helper.rb 中添加 RSpec.configure do |config| config.before(:example, type: :request) do |example| case example.metadata[:described_class] when Web::OrdersApp example.metadata[:swagger_base_path] = '/orders' when Web::AdminOrdersApp example.metadata[:swagger_base_path] = '/admin/orders' end end end
这样每个测试用例会自动匹配对应的路由前缀,不用在每个describe里重复写配置。
验证修改
重新运行rspec-swag的生成命令(比如rake rspec:swagger),生成的Swagger文档里的路径就会变成/orders/index、/admin/orders/index这类完整路径,就能正常在UI里测试API了。
内容的提问来源于stack exchange,提问作者gayavat
相关产品推荐
相关产品推荐

