У меня есть Product
схема, которая имеет UPI(unique product identifier)
например.A985748BNG6784C
.Это автоматически сгенерированный уникальный идентификатор продукта.
У меня есть функция upi_generate()
, которая вызывает другую внешнюю функцию gen_nano_id()
для генерации этого случайного уникального идентификатора.
Если случайно, сгенерированный gen_nano_id()
идентификатор уже сгенерирован, функция upi_generate()
рекурсивно вызывает себя до тех пор, пока gen_nano_id()
не сгенерирует уникальный идентификатор.Таким образом, генерация уникального UPI
.
gen_nano_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
Теперь я долженпроверить логику регенерации идентификаторов для дублирования идентификаторов.
Мой подход к тестированию предполагает следующую логику.Создайте два продукта с дубликатом UPI
и попробуйте достичь части _
сравнения случаев.
Для этой цели я высмеял (я не управляю поведением этой функции) gen_nano_id()
.
Теперь проблема, с которой я сталкиваюсь, заключается в насмешке, приводящей к созданию всегда одинаковых идентификаторов, несмотря ни на что, и я иду в бесконечном цикле.
Я не могу найти способдостичь exit condition(nil)
части сравнения случаев с этим насмешливым подходом gen_nano_id
.