我正在使用rspec对设备进行系统测试。该设备是模块化的,因此任何数量的子设备都可以连接到测试台。我想在很多地方编写测试,这些测试将遍历连接的子设备并在每个设备上运行相同的测试。
基本上,这就是我想要做的事情:
before(:all)
@tool = discover_sub_devices()
@tool.sub_devices.should == exp_sub_device_list
end
describe "some sub device tests" do
@tool.sub_devices.each do |dev|
it "should succeed at doing things" do
dev.do_thing.should == success
end
end
end
不幸的是,这不起作用。我得到错误,说@tool是nill,并且在测试运行之前不包含类sub_devices
。因此,在before(:all)
块运行之前,正在解析测试。
我可以使其工作的一种方法是将循环置于it
块内。像这样:
it "should succeed at doing things" do
@tool.sub_devices.each do |dev|
dev.do_thing.should == success
end
end
这样做的问题是我真的想要测试所有子设备,即使第一个子设备出现故障。我想看一个确切的子设备有多少故障的报告。一旦失败,该代码就会爆发,而不会测试其余代码。
我意识到这可能不是rspec的正常使用案例,但如果我可以做到这一点,它对我们的测试情况会非常方便。
有什么建议吗?
答案 0 :(得分:1)
以下是编写此内容的一些技巧。
最好避免使用before :all
。最好避免在示例之外创建对象。
describe "some sub device tests" do
let(:tool) { discover_sub_devices }
it "matches the sub device list" do
tool.sub_devices.should be == expected_sub_devices_list
end
it "succeeds with all sub-devices" do
failures = tool.sub_devices.reject{|d| d.do_thing == success}
# option 1
failures.should be_empty # will show just a yes/no result
# option 2
failures.size.should be == 0 # will show the number of failures
# option 3
failures.should be == [] # will display all sub-devices which fail
end
end
答案 1 :(得分:0)
您遇到的问题是describe
块的正文会立即执行,let
,before
和it
块的正文会被执行在以后执行。
假设您不需要每次都重新发现设备,您可以按照以下方式重构代码,取消before
来电:
describe "some sub device tests" do
tool = discover_sub_devices()
it "should discover sub devices correctly" do
tool.sub_devices.should == exp_sub_device_list
end
tool.sub_devices.each do |dev|
it "should succeed at doing things" do
dev.do_thing.should == success
end
end
end