首页 > 解决方案 > 如何在 RSpec 控制器规范中设置默认格式?

问题描述

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

标签: ruby-on-railsrubyrspecrspec-rails

解决方案


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

测试:RSpec 3.8,Rails 5.2.1

这个模块使用元编程来重新定义get, postetc 方法和一个记忆化的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.rbor中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是调用该方法的地方)。


推荐阅读