tim*_*xyz 33 ruby rspec ruby-on-rails factory-bot
transient do
FactoryBot工厂的目的是什么?
我见过很多以下面的东西开头的工厂.
factory :car do
owner nil
other_attribute nil
end
...
Run Code Online (Sandbox Code Playgroud)
我在这个博客上找到了一些信息:http://blog.thefrontiergroup.com.au/2014/12/using-factory-easily-create-complex-data-sets-rails/
但我仍然不完全明白如何以及为什么这样做.我对FactoryBot的体验很小.
任何有使用FactoryBot经验的人都可以分享一些见解吗?
Sam*_*iin 68
transient
attributes允许您传入不属于模型的属性的数据.
假设您有一个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
Run Code Online (Sandbox Code Playgroud)
因此,每当您创建汽车工厂并且想要将名称大写时.你可以做
car = FactoryGirl.create(:car, capitalize: true)
car.name
# => "JACKY"
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
Dav*_*mpy 14
瞬态属性本质上是工厂的本地变量,不会保留到创建的对象中。
我看到了瞬态属性的两个主要用途。在这两种情况下,他们让测试通过表达概念(类似于特征)来创建对象,而不需要了解任何有关实现的信息。这两个例子很容易理解,不需要了解任何对象内部结构:
FactoryBot.create(:car, make: 'Saturn', accident_count: 3)
FactoryBot.create(:car, make: 'Toyota', unsold: true)
Run Code Online (Sandbox Code Playgroud)
这两个示例以不同的方式使用瞬态:
在工厂内部,这两个瞬态的使用方式如下:
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
Run Code Online (Sandbox Code Playgroud)
调用中的两个属性create
(accident_count
和unsold
)不是模型的一部分,也没有显式保存......但两者都会对为测试创建的结果对象产生影响。这是瞬态值与特征值或显式属性值的本质区别。
IMO,当它们起作用时我会坚持使用特征(例如未售出,上面)。但是,当您需要传递非模型值(例如,accident_count)时,瞬态属性就是正确的选择。
归档时间: |
|
查看次数: |
11592 次 |
最近记录: |