初始化自动生成rspec测试

时间:2013-09-02 19:32:25

标签: ruby rspec

我是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块运行之前,阵列似乎没有被填满。有没有办法让它发挥作用?

3 个答案:

答案 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是最干净的,因为它只会导致另一个通过的测试。使用returnbreak会导致proc-closure或jump错误。我还尝试将我的方法包装在beginrescue块中,但它似乎无法捕获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

我认为答案取决于您希望数据变化的方式/原因。