Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 正在初始化自动生成rspec测试_Ruby_Rspec - Fatal编程技术网

Ruby 正在初始化自动生成rspec测试

Ruby 正在初始化自动生成rspec测试,ruby,rspec,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).

我是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

不幸的是,在
块运行之前,数组似乎没有被填满。有没有办法让它工作?

RSpec
开始执行
it
块之前,才会执行
before
块。但是您在
descripe
的外部主体中迭代
@array
,因此@array此时仍然是
nil
。在最后一个
it
块中,@数组已初始化

您可以在
it
块中放置几乎任何您想要的代码。例如,您可以编写:

it "should have elements > 3" do
  @array.each do |i|
    i.should > 3
  end
end
或者,如果需要单独的
it
调用,只需在descripe块本身中填充
@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
,指示您正在对数组的哪个元素(即什么索引)进行操作


至于基于
let
/
之前的
层次结构中定义的数据动态生成
it
语句,我认为这是不可能的,因为您只能访问
it
块中的数据,并且
it
块中的
it
不是可接受的DSL的一部分。

直到
RSpec
开始执行
it
块之前,才会执行
before
块。但是您在
descripe
的外部主体中迭代
@array
,因此@array此时仍然是
nil
。在最后一个
it
块中,@数组已初始化

您可以在
it
块中放置几乎任何您想要的代码。例如,您可以编写:

it "should have elements > 3" do
  @array.each do |i|
    i.should > 3
  end
end
或者,如果需要单独的
it
调用,只需在descripe块本身中填充
@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
,指示您正在对数组的哪个元素(即什么索引)进行操作


至于基于
let
/
之前的
层次结构中定义的数据动态生成
it
语句,我认为这是不可能的,因为您只能访问
it
块中的数据,并且
it
不是
it
块中可接受的DSL的一部分。

以下是我迄今为止能想到的最好的方法。这是肮脏的,但是如果在迭代未预定义的数组时生成测试是您所追求的,那么您可以尝试循环一个您认为会超出填充索引的数字

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
会导致进程关闭或跳转错误。我还尝试将我的方法包装在
begin
rescue
块中,但它似乎无法捕获
it
块中的任何错误

这是迄今为止我能想到的最好的。这是肮脏的,但是如果在迭代未预定义的数组时生成测试是您所追求的,那么您可以尝试循环一个您认为会超出填充索引的数字

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
会导致进程关闭或跳转错误。我还尝试将我的方法包装在
begin
rescue
块中,但它似乎无法捕获
it
块中的任何错误

不确定您是否找到了更好的答案,但想知道这是否能为您解决问题:

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

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

不确定您是否找到了更好的答案,但想知道这是否能解决您的问题:

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

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

我理解,但我如何才能使其在it块内工作?因为rspec不允许嵌套的
it
您想测试什么?测试应该只包含您期望在正常运行的生产代码中为真的断言。您当然可以在
it
块中放置迭代。我会更新我的答案以表明这一点。这当然是一个可行的方法,但它仍然只是一个测试。我想让rspec为我生成这些测试。例如,像
9.times do|i | it{i.should>3}end这样的东西将为我进行9个单独的测试,并且每个测试都有一个单独的失败跟踪。我想要的是使
9
dynamicwell这需要我事先知道
@array
的内容。出于我的目的,我想知道如果在(:all)
方法之前的
中填充
@array
,如何实现这一点,就像我最初的示例一样。内容将动态设置,这取决于(:all)
方法之前的
的其他结果。如果可以,我将尝试回答您的假设问题,但我不确定我是否理解为什么您不能在
description
的顶层编码,无论您想在
之前的
中编码什么:all
。我认为,它仍然是“充满活力的”。如果您使用的是
before:each
这将是一个不同的问题,但是使用
before:all
,我只是不理解您所寻求的差异。我理解,但是我如何才能从it块中使其工作?因为rspec不允许嵌套的
it
您想测试什么?测试只应