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
答案 0 :(得分:2)
此内容改编自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
方法中不可用)中没有。