带参数的 FactoryBot 序列

FactoryBot sequence with parameter

我希望能够以相同的方式递增不同的代码。例如:

如果我能让它以某种方式跳过第一次迭代就好了,但我主要关心的是能够以某种方式为要使用的序列传递不同的 code,这样我就不必为每个代码创建不同的序列。

# Not ideal
FactoryBot.define do
  sequence(:1234, "A") { |n| "1234" + n }
  sequence(:5678, "A") { |n| "5678" + n }
end

我尝试使用调用序列的工厂,但找不到任何使用创建字符串的工厂的示例。

FactoryBot.define do
  sequence(:letter, "A") { |n| n }

  factory :violation_code, :class => "String" do
    transient do
      code { "" }
    end
    base_code { code + generate(:letter) }
  end
end

build(:violation_code, :code => "1234")

我收到此错误 NoMethodError: undefined method 'base_code=' for "":String

要求:

会很好:

I don't have to create a different sequence for each code

这显然是不可能的,因为 FactoryBot 存储了 迭代器 并在后台调用 #next。您不能在序列之间共享迭代器。

能干什么,直接下手"1234A":

"1234A".next
#⇒ "1234B"

不幸的是,它从 "1234Z" 转到 "1235A"。但是 "Z".next 产生 "AA"。因此,将 FactoryBot::DefinitionProxy#sequence 包装成:

FactoryBot::DefinitionProxy.prepend(Module.new do
  def sequence(name, *args, &block)
    if args.last.is_a?(Hash) && prefix = args.last.delete(:prefix)
      super(name, *args) { |n| prefix + n }
    else
      super
    end
  end
end)

并这样称呼它:

FactoryBot.define do
  sequence("A", prefix: "1234")
end

我没有测试过,肯定会有明显的提升,但是思路应该很清晰。