繁体   English   中英

FactoryBot工厂中`transient do`块的目的是什么?

[英]What is the purpose of a `transient do` block in FactoryBot factories?

在FactoryBot工厂中transient do的目的是transient do

我见过很多以下面的东西开头的工厂。

factory :car do
  owner nil
  other_attribute nil
end
...

我在这个博客上找到了一些信息: http//blog.thefrontiergroup.com.au/2014/12/using-factory-easily-create-complex-data-sets-rails/

但我仍然不完全明白如何以及为什么这样做。 我对FactoryBot的体验很小。

任何有使用FactoryBot经验的人都可以分享一些见解吗?

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"

希望能帮助到你。

瞬态属性本质上是工厂本地的变量,不会持久存储到创建的对象中。

我已经看到了瞬态属性的两个主要用途:

  • 控制/改变相关对象的创建(例如accident_count)。
  • 更改分配给其他属性分配的值(例如未售出)。

当然,您可以将这些瞬态属性用于在对象创建期间编码所需的任何其他属性。

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,我会在他们工作时坚持特质(例如未售出,上面)。 但是当您需要传递非模型值(例如accident_count)时,瞬态属性是可行的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM