FactoryBot工厂中transient do
的目的是什么?
我见过许多以下面的东西开头的工厂。
factory :car do
owner nil
other_attribute nil
end
...
我在此博客上找到了一些信息:http://blog.thefrontiergroup.com.au/2014/12/using-factorygirl-easily-create-complex-data-sets-rails/
但我仍然不完全明白如何以及为何这样做。我对FactoryBot的体验很小。
任何有使用FactoryBot经验的人都可以分享一些见解吗?
答案 0 :(得分:52)
transient
属性允许您传递模型中不是属性的数据。
假设您有一个名为car
的模型,其中包含以下属性:
您希望在工厂中创建汽车模型时将汽车名称大写。我们能做的是:
factory :car do
transient do
# capitalize is not an attribute of the car
capitalize false
end
name { "Jacky" }
purchase_price { 1000 }
model { "Honda" }
after(:create) do |car, evaluator|
car.name.upcase! if evaluator.capitalize
end
end
因此,每当您创建汽车工厂并且想要将名称大写时。你可以做到
car = FactoryGirl.create(:car, capitalize: true)
car.name
# => "JACKY"
希望它有所帮助。
答案 1 :(得分:0)
临时属性本质上是工厂本地的变量,不会持久到创建的对象中。
我已经看到了过渡属性的两个主要用途:
您当然可以在对象创建过程中将这些瞬态属性用于需要编写代码的其他任何地方。
factory :car do
transient do
accident_count 0
unsold false
end
owner unsold ? 'new inventory' : nil
after(:create) do |car, evaluator|
create_list(:police_report, evaluator.accident_count, vehicle: car)
end
end
这使您的测试可以表达一个概念(类似于特征),而无需了解有关实现的任何信息:
FactoryBot.create(:car, make: 'Saturn', accident_count: 3)
FactoryBot.create(:car, make: 'Toyota', unsold: true)
IMO,我会坚持使用特质(例如上面未售出的特质)。但是,当您需要传递非模型值(例如,accurate_count)时,可以使用临时属性。