在它的块中使用factory_girl对象

时间:2014-04-07 06:40:53

标签: rspec scope factory-bot

我想循环遍历由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尚未进行评估,我收到nilbefore :each的错误。我尝试在@arraylet设置let!,但没有取得任何成功。

你还有其他建议吗?

2 个答案:

答案 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上下文中使用letlet!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