【发布时间】:2019-02-03 08:48:09
【问题描述】:
我有一个 Product 架构,它有一个 UPI(unique product identifier) 例如。 A985748BNG6784C。这是一个自动生成的唯一产品标识符。
我有一个函数upi_generate(),它调用另一个外部函数gen_nano_id() 来生成这个随机的唯一ID。
如果偶然gen_nano_id()生成的id已经生成,函数upi_generate()会递归调用自己,直到gen_nano_id()生成一个唯一的id。从而生成一个唯一的UPI。
gen_nano_id() 有时会返回重复的 id,为此我使用递归调用编写了以下代码。
def gen_nano_id() do //external function
Nanoid.generate(10, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
end
# TODO: write test case for this
def upi_generate() do // required function
upi = "A" <> gen_nano_id() <> "C"
case get_product_with_upi(upi) do
nil ->
upi
_ ->
upi_generate()
end
end
// Check if product with UPI already exists
defp get_product_with_upi(upi) do
from(p in "snitch_products", select: p.upi, where: p.upi == ^upi)
|> Repo.one()
end
现在,我必须测试重复 ID 的 ID 重新生成逻辑。
我的测试方法涉及以下逻辑。
创建具有重复UPI 的两个产品并尝试达到案例比较的_ 部分。
为此,我模拟了(我不控制此函数的行为)gen_nano_id()。
现在,我面临的问题是模拟导致创建始终相同的 id 无论如何,我进入无限循环。
与gen_nano_id 的这种模拟方法相比,我无法找到一种方法来达到exit condition(nil) 部分案例比较。
【问题讨论】:
-
如果你需要唯一键,为什么不使用 UUID 模块,它没有这样的问题,你总是得到唯一键hex.pm/packages/uuid
-
@fad3d 因为我想自定义生成的 uuid,使其仅由数字和大写字母组成。