我想循环遍历由it
块之外的factory_girl构建的对象数组。
示例:
before :each do
@array = build(:super_cool_array_of_objects)
end
context 'I want access to @array here' do
@array.each do |item|
it 'tests item for some interesting things' do
item.should be_true # my test is more complicated than this
end
end
end
但是当我执行此操作时,由于@array
尚未进行评估,我收到nil
为before :each
的错误。我尝试在@array
和let
设置let!
,但没有取得任何成功。
你还有其他建议吗?
答案 0 :(得分:1)
我希望您要做的就是在方法中使用FactoryGirl隔离构建内容的逻辑,然后使用它来定义各种Rspec示例。
这是通过创建全局方法来实现的一种技术。
def how_about_a_method
2.times.map { FactoryGirl.build(:foo) }
end
describe 'lucys question' do
context 'accessing something' do
how_about_a_method.each do |item|
it 'should have an item' do
expect(item).to be
end
end
end
end
请注意,您需要使用FactoryGirl.build
,因为在您的spec_helper中,您已指定将FactoryGirl语法方法包含在config.include FactoryGirl::Syntax::Methods
中,但在此全局方法中,您需要使用@array
不再是RSpec课程,所以FactoryGirl还没有被包括在内。我倾向于不包括在文档中指定的FactoryGirl,而是总是显式引用FactoryGirl,就像我在这里的方法中所做的那样。
一个更有趣的问题是"为什么it
为零?"。它有助于理解RSpec如何工作。在context
块内部就是所谓的示例。这与ExampleGroup
块(称为before
)的范围不同。尝试在ExampleGroup上下文中使用let
,let!
或it
的结果不起作用,因为它们也在示例上下文中进行评估,这与{{{{ 1}}块在。
显然,全局方法是全局方法,因此您可以随时随地访问它。
我个人认为范围界定是RSpec最复杂的部分。我希望它记录得更好。
答案 1 :(得分:0)
这适合我。
describe 'something' do
array = [1,2,3]
context 'access array here' do
array.each do |item|
it 'tests item for some interesting things' do
item.should be_true # my test is more complicated than this
end
end
end
end
FactoryGirl版本:
您可以将FactoryGirl.build(...)
作为替换表达式放到[1,2,3]
。
gem 'factory_girl'
require 'factory_girl'
FactoryGirl.define do
factory :super_cool_array_of_objects, class: Array do
initialize_with { [1,2,3] }
end
end
describe 'something' do
context 'access array here' do
FactoryGirl.build(:super_cool_array_of_objects).each do |item|
it "tests item #{item} for some interesting things" do
item.should be_true # my test is more complicated than this
end
end
end
end