Как установить формат по умолчанию в спецификациях контроллера RSpec? - PullRequest
0 голосов
/ 16 ноября 2018
Приложение

Rails имеет контроллер с действиями, которые отвечают форматам html и json.В спецификации я должен указать format: 'json' для всех запросов:

it 'returns list of entities' do
  get :list, format: 'json'
  ...
end

Есть ли способ избежать записи format: 'json' для каждого примера?Как то так:

context 'json', format: 'json' do
  it 'returns list of entities' do
    get :list
    ...
  end
end

1 Ответ

0 голосов
/ 16 ноября 2018

Это адаптировано из 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).

...