带参数的 FactoryBot 序列
FactoryBot sequence with parameter
我希望能够以相同的方式递增不同的代码。例如:
- 如果代码是
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
。
要求:
- 生成带有代码和递增字母的字符串。
会很好:
- 跳过第一次迭代,因此 returns 只是第一次调用
generate()
时的代码。
- 当它到达
Z
时,希望它转到 AA
而不是 A
。
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
我没有测试过,肯定会有明显的提升,但是思路应该很清晰。
我希望能够以相同的方式递增不同的代码。例如:
- 如果代码是
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
。
要求:
- 生成带有代码和递增字母的字符串。
会很好:
- 跳过第一次迭代,因此 returns 只是第一次调用
generate()
时的代码。 - 当它到达
Z
时,希望它转到AA
而不是A
。
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
我没有测试过,肯定会有明显的提升,但是思路应该很清晰。