【问题标题】:How do I set a default format in RSpec controller specs?如何在 RSpec 控制器规范中设置默认格式?
【发布时间】:2018-11-16 15:13:46
【问题描述】:

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-rails ruby rspec rspec-rails


【解决方案1】:

这改编自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 方法的地方)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多