我想创建一个测试用例来可靠地处理数据库中存在冲突的情况。当用户在我的应用程序中执行某些操作时,随机的12位数字将被保存到附加到该操作的数据库中。如果数字不是全长,则该数字填充到12位数字。如果该数字已经存在于数据库中,那么该程序将选取另一个随机数。在Elixir中测试随机值冲突
这可能听起来很愚蠢,但预期的用户群可能会少于100-1000个用户。
我的代码看起来像
def gen_random_unique() do
unique = (:rand.uniform(1_000_000_000_000) - 1)
|> Integer.to_string()
|> String.pad_leading(12, ["0"])
case get_from_database(unique) do
nil ->
unique
_ ->
gen_random_unique()
end
end
除了测试次数的第二个条件上百万,直到它通过,有没有灵药更简单的方法,迫使这条道路?由于函数是递归的,我不知道我只能在第一次调用时如何模拟它(如果这是我需要采取的路径)。
谢谢!
您可以将限制作为默认值为“1_000_000_000_000”的函数的参数,并在测试中将其传递给一个较小的值,例如, '100'。 – Dogbert
为什么不在数据库级别只有一个唯一的约束,并且如果它已经存在就会报错?你也可以在数据库中编写一个函数,完全避免需要生成和检查应用程序中的值。是否有任何理由不只是使用UUID而不是随机生成的数字? –
我会使用UUID,但它是用户可以键入以查看记录的字符串。我也在想我可以让这个世代过程更具决定性,但仍然有12个字符。很显然,UUID会成为用户类型的负担。 :P –