ruby-on-rails - 如何在 RSpec 控制器规范中设置默认格式?
问题描述
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
解决方案
这改编自https://stackoverflow.com/a/39399215/544825,但适用于控制器规格。
测试:RSpec 3.8,Rails 5.2.1
这个模块使用元编程来重新定义get
, post
etc 方法和一个记忆化的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
or中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
是调用该方法的地方)。
推荐阅读
- azure - 在 blob 存储中转换 xslx csv 文件并存储到 ADLS
- database - 如何开始数据输入、记录和绘图程序?(我可能会移植到一个网站)
- tensorflow - 微调后如何评估 Huggingface 模型?
- docker - 如何在 HPC 集群上运行奇异容器?- 错误:创建用户命名空间失败:用户命名空间已禁用
- reactjs - 无法读取未定义的属性(读取“updateProfile”)
- cpu - 假设 64 位计数器不会溢出是否安全?
- python - 为配置屏幕中的每个设置调用不同方法的 Pythonic 方式
- reactjs - 如何在路由所在的同一组件中访问参数
- html - 如何确定 inline-flex div 的宽度?
- python - (Python) dash 核心组件 - ModuleNotFound