重载 factory_girl 工厂

13

我希望在更改工厂时,无需重新启动所有控制台,在rails控制台中即可查看更改。

我发现了一些代码行,并在对其理解不够充分的情况下进行了测试,文档对我来说并不清晰:

FactoryGirl.reload

我还进行了以下测试:

> FactoryGirl.factories.clear
> FactoryGirl.find_definitions # also tested FactoryGirl.factories.find_definitions
                               # but NoMethodError is raised
=> ActiveRecord::RecordNotFound: Couldn't find Address with ID=277 Torphy Squares

3
通常我只是使用 FactoryGirl.reload - apneadiving
2个回答

18

你还可以使用reload!重新加载控制台环境,但它不会重新加载工厂。使用FactoryGirl.reload来重新加载工厂定义。它会从以下位置(请参见文档)(重新)加载这些定义:

test/factories.rb
spec/factories.rb
test/factories/*.rb
spec/factories/*.rb

你提到的其他命令用于清除和加载定义。 FactoryGirl.factories.clear 清除所有已加载的工厂定义,而FactoryGirl.find_definitions 重新从文件加载所有定义。

请确保在Rails上使用factory_girl_rails gem。例如,如果你定义了一个factory :user,你可以在控制台中使用FactoryGirl.build(:user)FactoryGirl.create(:user)。这将返回一个User实例。

如果这样做不起作用,请发布更多细节信息。


重新加载!不起作用。你的意思是它重新加载工厂吗?例如,它会将序列设置回到初始状态吗? - Jwan622
def self.reload reset_configuration register_default_strategies register_default_callbacks find_definitions end - Sebastián Palma

8

我使用了Faker。查看解决问题的更改差异:

# factories/building.rb, address is a string

- address    Faker::Address.street_address
+ address    { Faker::Address.street_address }

# factories/user.rb, email is a string

- email Faker::Internet.email
+ email { Faker::Internet.email }

然后FactoryGirl.reload就能正常工作了。


1
没错 - 这是 FactoryGirl 的一个大坑。在第一种情况下,当工厂被加载时,Faker::Address 只会被评估一次,然后再也不会了。因此它是一个常量。在第二种情况下,代码块每次使用时都会被评估,因此它会随着每次使用而改变。第二种情况几乎总是你想要的,而第一种情况只是一堆暴露在那里等待伤害别人的尖锐旋转刀片。 - Rob
这个答案也为我节省了大量时间。我应该好好看看文档(请参阅他们的入门指南中的动态属性)。 - Dave Rapin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接