2017-08-16 9 views
1

データベースの値が衝突した場合に確実に処理するためのテストケースを作成しようとしています。ユーザーが自分のアプリケーションで何らかのアクションを実行すると、そのアクションにアタッチされたデータベースにランダムな12桁の数字が保存されます。完全な長さでない場合、数字は12桁になります。その番号がすでにデータベースに存在する場合、プログラムは別の乱数を選択します。エリクシルのランダムな値の衝突をテストする

これはおそらくダムに聞こえるかもしれませんが、予想されるユーザーベースは100-1000ユーザー以下になる可能性があります。

私のコードは、それが通過するまでの時間の第2の条件数百万人のテストは別に

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 

ようになり、そのパスを強制するエリクサーで簡単な方法はありますか?関数が再帰的なので、私は最初の呼び出し(それは私が取る必要があるパスの場合のみ)を嘲笑する方法がわからない。

ありがとう!

+0

デフォルト値「1_000_000_000_000」を使用して、関数の引数を制限することができます。テストでは、より小さい値を渡します。 '100'。 – Dogbert

+0

データベースレベルでユニークな制約があるだけでなく、すでに存在する場合はエラーを報告するのはなぜですか?アプリケーションに値を生成してチェックする必要性を完全に回避する関数をデータベースに書き込むこともできます。無作為に生成された番号の代わりにUUIDを使用するだけの理由はありますか? –

+0

私はUUIDを使用しますが、ユーザーがレコードを表示するために入力できる文字列です。私は、世代プロセスをより決定論的にすることもできると思っていましたが、まだ12文字です。明らかに、UUIDはユーザタイプを作るのにかなり負担になるでしょう。 :P –

答えて

1

カバレッジでユニットテストをしているようです。

なぜget_from_databaseという別の模擬テストを2回実行して、caseブランチをテストできるのでしょうか。

+0

これは間違いなくオプションです。私はまだまだエリクサー "ノブ"です。テストをシリアルで実行せずにテストを行うことは可能ですか?模擬ライブラリが非同期テストを混乱させるようです。 –

+1

@DylanAspdenあなたは[this](https://github.com/elixir-lang/elixir/issues/3580)について話していると思いますか?実際に異なるテストを並列化する必要がある場合は、別々のテストケースを作成できます。 –

+0

私はすべてを考え直し、プロセスをより決定論的にすることにしました。ありがとう! –

関連する問題