Ruby 正在初始化自动生成rspec测试
我是Rspec的新手,试图让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).
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
您想测试什么?测试只应