如何在RSpec控制器规格中设置默认格式?

时间:2018-11-16 15:13:47

标签: ruby-on-rails ruby rspec rspec-rails

Rails应用程序的控制器具有响应htmljson格式的动作。在规范中,我应该为所有请求指定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 :(得分:2)

此内容改编自https://stackoverflow.com/a/39399215/544825,但适用于控制器规格。

经过以下测试:RSpec 3.8,Rails 5.2.1

此模块使用元编程来重新定义getpost等方法和已记忆的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.rbspec_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方法中不可用)中没有。