我是Rspec的新手,并试图让Rspec为变量创建新的测试。这是我尝试过的:
require 'rspec'
describe 'a test' do
@array = []
before(:all) do
@array = [1,3,4,6,9,2]
end
@array.each do |i|
it { i.should > 3 }
end
it { @array.should have(4).items }
end
不幸的是,在.each
块运行之前,阵列似乎没有被填满。有没有办法让它发挥作用?
答案 0 :(得分:1)
在before
开始执行RSpec
块之前,it
块才会执行。但是你在@array
的外部体内迭代describe
,所以@array在那时仍然是nil
。在最后it
块中,@ array 已已初始化。
您可以在it
块中放置您想要的任何代码。例如,您可以写:
it "should have elements > 3" do
@array.each do |i|
i.should > 3
end
end
或者,如果您需要单独的it
次调用,则可以在描述块本身中填充@array
,如下所示:
describe 'a test' do
@array = [1,3,4,6,9,2]
@array.each do |i|
it { i.should > 3 }
end
it { @array.should have(4).items }
end
虽然您可能希望在这种情况下重做它,以便将字符串参数传递给it
,指示您正在操作的数组的哪个元素(即什么索引)。
至于根据it
/ let
层次结构中定义的数据动态生成before
语句,我认为这不可能,因为您只能访问该数据。 it
阻止it
不是it
阻止中可接受的DSL的一部分。
答案 1 :(得分:0)
到目前为止,这是我能想出的最好成绩。它很脏,但如果在迭代未预定义的数组时生成测试就是你所追求的,那么你可以尝试循环一个你认为会超过填充索引的数字。
require 'rspec'
describe 'a test' do
before(:all) do
@array = [1,3,4,6,9,2]
end
16.times do |i|
it 'has a desc' do
next if @array[i].nil?
@array[i].should > 3
end
end
end
这里需要注意的是你将如何处理数组填充索引之后的索引测试。到目前为止,我发现使用next
是最干净的,因为它只会导致另一个通过的测试。使用return
或break
会导致proc-closure或jump错误。我还尝试将我的方法包装在begin
,rescue
块中,但它似乎无法捕获it
块中的任何错误。
答案 2 :(得分:0)
不确定您是否设法提出了更好的答案,但想知道这是否能解决问题:
RSpec.describe 'a test' do
array = (1..100).to_a.sample(6)
array.each do |i|
it 'has a desc' do
expect(i).to be > 3
end
end
end
我认为答案取决于您希望数据变化的方式/原因。