假设我有以下规格:
describe Thing do
it 'can read data' do
@data = get_data_from_file # [ '42', '36' ]
expect(@data.count).to eq 2
end
it 'can process data' do
expect(@data[0].to_i).to eq 42 # Fails because @data is nil
end
end
我想要的只是在给定的环境中共享一个变量describe or context。我会在一个示例中写入一个值,然后在另一个示例中读取它。我怎么做?
你应该使用before(:each)
or before(:all)
block:
describe Thing do
before(:each) do
@data = get_data_from_file # [ '42', '36' ]
end
it 'can read data' do
expect(@data.count).to eq 2
end
it 'can process data' do
expect(@data[0].to_i).to eq 42
end
end
不同之处在于before(:each)
将针对每种情况单独执行before(:all)
在此所有示例之前一次describe/context
。我会推荐你更喜欢before(:each)
over before(:all)
,因为在这种情况下每个示例都会被隔离,这是一个很好的做法。
在极少数情况下您想要使用before(:all)
,例如,如果您的get_data_from_file
执行时间很长,在这种情况下,您当然可以牺牲测试隔离来提高速度。但我想知道你,当使用before(:all)
,修改你的@data
一次测试中的变量(it
块)将导致其他测试的意外后果describe/context
范围,因为他们会分享它。
before(:all)
例子:
describe MyClass do
before(:all) do
@a = []
end
it { @a << 1; p @a }
it { @a << 2; p @a }
it { @a << 3; p @a }
end
将输出:
[1]
[1, 2]
[1, 2, 3]
UPDATED
来回答你的问题
describe MyClass do
before(:all) do
@a = []
end
it { @a = [1]; p @a }
it { p @a }
end
会输出
[1]
[]
因为在第一it
您在本地分配实例变量@a,因此它与中的@a不同before(:all)
阻止并且对其他人不可见it
块,你可以通过输出来检查它object_id
s。因此,只有修改才能解决问题,赋值将导致新对象的创建。
因此,如果您多次分配变量,您可能最终会得到一个it
块和其中的多重期望。根据最佳实践,这是可以接受的。 http://betterspecs.org/#single
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)