Это адаптировано из https://stackoverflow.com/a/39399215/544825, но для спецификаций контроллера.
Проверено на: RSpec 3.8, Rails 5.2.1
Этот модуль использует метапрограммирование для переопределения get
, post
и т. Д. И запомненный let
помощник (default_format
) вместо метаданных.
Он просто объединяет format: default_format
с аргументами и вызывает исходную реализацию.
# spec/support/default_format.rb
module DefaultFormat
extend ActiveSupport::Concern
included do
let(:default_format) {}
prepend RequestHelpersCustomized
end
module RequestHelpersCustomized
l = lambda do |path, **kwargs|
kwargs[:format] ||= default_format if default_format
super(path, kwargs)
end
%w(get post patch put delete).each do |method|
define_method(method, l)
end
end
end
А затем включите этот модуль в свои rails_helper.rb
или spec_helper.rb
(если у вас есть только один файл настроек теста):
require 'support/default_format'
RSpec.configure do |config|
# ...
config.include DefaultFormat, type: :controller
# ...
end
Использование:
context 'json' do
let(:default_format) { :json }
end
НадеюсьНе думаю, что это можно сделать с помощью метаданных примера, поскольку они недоступны из примера (именно здесь вызывается метод get
).