Тестирование функции эликсира - PullRequest
0 голосов
/ 16 января 2019

У меня есть 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.

1 Ответ

0 голосов
/ 16 января 2019

Хосе Валим отлично пишет Насмешки и явные контракты . Это говорит

всегда считают «макет» существительным , а не глаголом


Это означает, что вы не должны высмеивать функцию генерации . Вам лучше создать генератор и поиздеваться над ним.

Примерно так:

defmodule Generator do
  @callback gen_id :: integer()
end

defmodule NanoGenerator do
  @moduledoc "Used in dev/prod"
  @behaviour Generator

  @impl true
  def gen_id() do
    get_nano_id() # external function or whatever
  end
end

defmodule TestGenerator do
  @moduledoc "Used in test"
  @behaviour Generator

  use Agent # to store state
  @ids ~w|foo foo bar|

  @impl true
  def gen_id() do
    id = # get the counter from Agent, and increase it
    @ids[id]
  end 
end

Теперь все готово для возврата того, что вы хотите из генератора.

...