1

我是 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不幸的是,在块运行之前,数组似乎没有被填满。有没有办法让它工作?

4

3 回答 3

1

直到开始执行块before之前,块才会被执行。但是你在 的外部进行迭代,所以 @array 仍然在那个时候。在最后一个块中,@array被初始化。RSpecit@arraydescribenilit

您可以将几乎任何您想要的代码放在一个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而不是块内可接受的 DSL 的一部分it

于 2013-09-02T19:58:32.623 回答
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

这里需要注意的是,您将如何处理超出数组填充索引的索引测试。到目前为止,我发现 usingnext是最干净的,因为它只会导致另一个通过的测试。使用returnbreak导致 proc-closure 或跳转错误。我还尝试将我的方法包装在begin,rescue块中,但它似乎无法捕获it块中的任何错误。

于 2013-09-03T14:19:53.410 回答
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

我认为答案取决于您希望数据如何/为什么发生变化。

于 2018-03-26T18:17:29.200 回答