如何向FactoryBot工厂添加方法?

时间:2018-07-14 18:14:24

标签: ruby rspec factory-bot

说我有一个称为存储值的类,它存储值数组:

class Storage
  attr_accessor :values 

  def initialize(*vals)
    @values = vals
  end 
end

并为此类设置了工厂

FactoryBot.define do
  factory :storage do
    values { [1, 2, 3] }
  end
end

如何添加一种方便的方法来编辑值?

我希望能够在现有工厂上调用名为#use_values的方法来对其进行更新,例如:

factory = FactoryBot.build(:storage)
factory.values #=> [1, 2, 3]

factory.use_values(4, 5, 6)
factory.values #=> [4, 5, 6]

我希望语法看起来像这样(尽管这不起作用):

FactoryBot.define do
  factory :storage do
    values { [1, 2, 3] }

    def use_values(*vals)
      self.values = vals
    end
  end
end

我该怎么做?

我认为这应该很容易做到,但是我似乎找不到任何好的资源。

注意

我知道我可以在初始版本中使用选项来指定#values返回值,如下所示:

FactoryBot.build(:storage, values: [4, 5, 6])

这不是我想要的。我想要一种方法来调用已经存在的工厂中的方法来更新它,而不是使用特定值来建立工厂。

1 个答案:

答案 0 :(得分:2)

您已经可以定义values属性的值,无论何时何地,无论使用什么gem,只要在Storage类的实例中就可以,因为您已经定义了values的属性访问器。

require 'factory_bot'

class Storage
  attr_accessor :values

  def initialize(*values)
    @values = values
  end
end

FactoryBot.define do
  factory :storage do
    values { [1, 2, 3] }
  end
end

storage_instance = FactoryBot.build(:storage)
p storage_instance.values # [1, 2, 3]
storage_instance.values = [4, 5, 6]
p storage_instance.values # [4, 5, 6]

在类上添加属性访问器,传递符号,使您能够在属性上命名属性,为其创建实例变量,以及用于设置和获取其值的读写方法({{1 }},:values=方法)。

因此,添加:values只是设置values属性的另一种方式。