RSpec: 我可以禁用某些共享示例测试吗?
RSpec: Can I disable certain shared examples tests?
我在 RSpec 中使用 shared_examples
到 运行 一组针对多种上传格式的测试,例如 yml、csv 等,用于许多不同的 rspec文件。但是,我的 rspec 测试之一 运行 宁这些共享示例,不支持 csv 上传格式。是否可以 disable/skip 在这个 rspec 文件的共享示例中进行某些 csv 测试?
一个选项是将允许的上传格式添加到您的控制器,并让测试检查您的控制器。这可能会使生产代码和测试代码都变干。
class ApplicationController
def self.upload_formats
[:yaml, :json, :csv]
end
end
class OtherController < ApplicationController
def self.upload_formats
[:yaml, :json]
end
end
shared_examples 'it accepts uploads' do
let(:formats) { described_class.upload_formats }
...
end
这可能太干了;如果 self.upload_formats
缺少一种格式,测试将无法捕获它。
您可以向共享示例添加一个标志并传递它应该检查的格式。如果每种格式的测试都相似,这就变成了一个简单的循环。
shared_examples 'it accepts uploads' do |formats: [:yaml, :json, :csv]|
formats.each do |format|
let(:format) { format }
context "in #{format}" do
...
end
end
end
大多数测试将保持不变并使用默认值。
it_behaves like 'it accepts uploads'
您的例外可以指定它们的格式。
it_behaves like 'it accepts uploads', formats: [:yaml, :json]
如果比这更复杂,您可能希望将共享测试分解为针对每种格式的单独测试。原始共享测试 运行 是所有单独的共享测试。离群值可以挑挑拣拣。
shared_examples 'it accepts uploads in all formats' do
it_behaves_like 'it accepts yaml uploads'
it_behaves_like 'it accepts json uploads'
it_behaves_like 'it accepts csv uploads'
end
同样,大多数测试保持不变。
it_behaves_like 'it accepts uploads in all formats'
异常值可以 运行 单独测试。
it_behaves_like 'it accepts yaml uploads'
it_behaves_like 'it accepts json uploads'
这还有一个额外的好处,可以分解可能是大型共享示例的内容,并允许进一步自定义单个共享示例。
为了方便,您可以将两者结合起来。
shared_examples 'it accepts uploads' do |formats: [:yaml, :json, :csv]|
it_behaves_like 'it accepts yaml uploads' if formats.include?(:yaml)
it_behaves_like 'it accepts json uploads' if formats.include?(:json)
it_behaves_like 'it accepts csv uploads' if formats.include?(:csv)
end
我在 RSpec 中使用 shared_examples
到 运行 一组针对多种上传格式的测试,例如 yml、csv 等,用于许多不同的 rspec文件。但是,我的 rspec 测试之一 运行 宁这些共享示例,不支持 csv 上传格式。是否可以 disable/skip 在这个 rspec 文件的共享示例中进行某些 csv 测试?
一个选项是将允许的上传格式添加到您的控制器,并让测试检查您的控制器。这可能会使生产代码和测试代码都变干。
class ApplicationController
def self.upload_formats
[:yaml, :json, :csv]
end
end
class OtherController < ApplicationController
def self.upload_formats
[:yaml, :json]
end
end
shared_examples 'it accepts uploads' do
let(:formats) { described_class.upload_formats }
...
end
这可能太干了;如果 self.upload_formats
缺少一种格式,测试将无法捕获它。
您可以向共享示例添加一个标志并传递它应该检查的格式。如果每种格式的测试都相似,这就变成了一个简单的循环。
shared_examples 'it accepts uploads' do |formats: [:yaml, :json, :csv]|
formats.each do |format|
let(:format) { format }
context "in #{format}" do
...
end
end
end
大多数测试将保持不变并使用默认值。
it_behaves like 'it accepts uploads'
您的例外可以指定它们的格式。
it_behaves like 'it accepts uploads', formats: [:yaml, :json]
如果比这更复杂,您可能希望将共享测试分解为针对每种格式的单独测试。原始共享测试 运行 是所有单独的共享测试。离群值可以挑挑拣拣。
shared_examples 'it accepts uploads in all formats' do
it_behaves_like 'it accepts yaml uploads'
it_behaves_like 'it accepts json uploads'
it_behaves_like 'it accepts csv uploads'
end
同样,大多数测试保持不变。
it_behaves_like 'it accepts uploads in all formats'
异常值可以 运行 单独测试。
it_behaves_like 'it accepts yaml uploads'
it_behaves_like 'it accepts json uploads'
这还有一个额外的好处,可以分解可能是大型共享示例的内容,并允许进一步自定义单个共享示例。
为了方便,您可以将两者结合起来。
shared_examples 'it accepts uploads' do |formats: [:yaml, :json, :csv]|
it_behaves_like 'it accepts yaml uploads' if formats.include?(:yaml)
it_behaves_like 'it accepts json uploads' if formats.include?(:json)
it_behaves_like 'it accepts csv uploads' if formats.include?(:csv)
end