我的问题一定已经解决但我无法找到。
我在各种描述块中有不同文件中的测试/示例。这些测试可以在手机,平板电脑和台式机三种不同配置下运行。通过测试分组的最佳实践是什么,以便我可以一起运行它们或独立运行它们。
我尝试了shared_example方法
shared_examples 'tests' do |form_factor|
it 'example 1' do
end
it 'example 2' do
end
it 'example 3' do
end
end
在另一个档案中
shared_examples 'tests' do |form_factor|
it 'example 1' do
end
it 'example 2' do
end
end
但是这种方法不适用于另一个文件中的测试。只要我在另一个文件中添加另一个shared_examples块,我就会得到
WARNING: Shared example group 'tests' has been previously defined at:
/1_spec.rb:3
...and you are now defining it at:
/2_spec.rb:2
The new definition will overwrite the original one.
我也尝试过使用环境变量的方法,但是在命令行上传递所有这些
FORM_FACTOR=phone rspec .
FORM_FACTOR=table rspec .
看起来很笨重。建议?我的目标是能够传递不同的form_factor或运行所有这些。所以,如果我做了像
这样的事情rspec run_all
应传递所有形状因子并运行所有三个测试 如果我发送
rspec run_phone
只能发送电话
答案 0 :(得分:6)
为不同的过滤器添加spec/spec_helper.rb
文件自定义配置:
RSpec.configure do |config|
if config.filter[:type] == :desktop
# configuration for desktop
elsif config.filter[:type] == :tablet
# configuration for tablet
end
....
end
是的,您仍然需要为每种类型运行单独的命令,但为什么不将它们连接成一个:
rspec --tag type:desktop; rspec --tag type:tablet; rspec --tag type:phone
另一种选择是创建Rake任务,为每种类型运行rspec测试。
答案 1 :(得分:4)
您是否考虑过使用tags?:
describe "a test", :phone do
...
end
describe "another test", :tablet do
..
end
$ rspec --tag phone # runs examples/groups tagged :phone
describe "yet another test", :type => :desktop do
...
end
$ rspec --tag type:desktop # runs examples/groups tagged :desktop
答案 2 :(得分:2)
我相信你想要的是RSpec shared_examples
和标签的组合。
我将展示一个非常简洁的例子:
shared_examples "testable device" do |form_factor|
it "example 1" do
end
it "example 2" do
end
end
context "with a tablet", type: :tablet do
let(:configuration) { }
it_behaves_like "testable device", "700x800"
end
context "with a phone", type: :phone do
let(:configuration) { }
it_behaves_like "testable device", "300x400"
end
如果您不想进行其他配置,只需运行所有类型,就可以正常运行rspec
。如果您只想要特定类型rspec --tag type:phone
。
如果您在多个文件中使用这些配置,我建议您查看:shared_context
shared_context "tablet configuration", type: :tablet do
before { @some_var = :some_value }
def shared_method
"it works"
end
let(:configuration) { {'arbitrary' => 'object'} }
end
默认情况下,如果您为shared_context
定义提供元数据,则上下文将自动包含在具有匹配元数据的规范中。