代码之家  ›  专栏  ›  技术社区  ›  Katrina

带参数的FactoryBot序列

  •  0
  • Katrina  · 技术社区  · 6 年前

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

    • 如果代码是 1234 : 1234, 1234A, 1234B, ...
    • 如果代码是 5678 : 5678, 5678A, 5678B, ...

    如果我能让它跳过第一次迭代就好了,但是我主要关心的是如何通过一个不同的迭代 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 .

    • 生成带有代码和递增字母的字符串。

    • 跳过第一次迭代,以便只返回第一次调用时的代码 generate()
    • 当它到达 Z ,希望它转到 AA 而不是 A .
    1 回复  |  直到 6 年前
        1
  •  2
  •   Aleksei Matiushkin    6 年前

    我不必为每个代码创建不同的序列

    FactoryBot 存储 迭代器 还有电话 #next 在引擎盖下面。不能在序列之间共享迭代器。

    "1234A" :

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

    不幸的是,它去了 "1235A" "1234Z" "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