ruby 在factorygirl中设置示例变量

h6my8fg2  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(135)

假设我有一个模型

class Vehicle < ActiveRecore::Base

  after_initialize :set_ivars

  def set_ivars
    @my_ivar = true
  end
end

在代码中其他地方,我会执行类似于@vehicle.instance_variable_set(:@my_ivar,false)的操作
然后使用该Ivar确定运行哪些验证。
如何将此Ivar传递给FactoryGirl?

FactoryGirl.define do
   factory :vehicle do
      association1
      association2
   end
 end

如何在创建后保存前将ivar_set编码到上面的代码中?如何将它传递到FactoryGirl.create()中?

hgncfbus

hgncfbus1#

FactoryGirl.define do
   factory :vehicle do
      association1
      association2
      ignore do
        my_ivar true
      end

      after(:build) do |model, evaluator|
        model.instance_variable_set(:@my_ivar, evaluator.my_ivar)
      end
    end
 end

 FactoryGirl.create(:vehicle).my_ivar                    #=> true
 FactoryGirl.create(:vehicle, my_ivar: false).my_ivar    #=> false
5us2dqdw

5us2dqdw2#

回答有点晚了,不过我需要在模型上设置一个示例变量。由于上面的答案不适用于最新版本的工厂机器人,我做了一些研究,发现下面的方法对我有效:

FactoryGirl.define do
   factory :vehicle do
     association1
     association2
   end
   transient do
     my_ivar { true }
   end

   after(:build) do |model, evaluator|
     model.instance_variable_set(:@my_ivar, evaluator.my_ivar)
   end
 end

它几乎与上面的答案相同,但它使用了transient关键字而不是ignore,我假设这是ignore的就地替换。
它所做的是允许定义一个变量,你可以将它传递给工厂,但最终不会在结果对象上设置它。这反过来又给了你一个机会,基于它来做逻辑。就像我们在这个例子中所做的(尽管很简单),我们基于提供的 transient 变量来设置一个示例变量。
请注意,在赋值器变量中设置并提供了 transient 变量。
参考文献:

  • transient 属性- Factory bot文档

相关问题