测试灵丹妙药功能

问题描述 投票:1回答:1

我有具有ProductUPI(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的结果无论怎样,我去一个无限循环。

我无法想出一个办法来达到与exit condition(nil)的这种嘲讽方法时相比的gen_nano_id一部分。

elixir phoenix-framework
1个回答
3
投票

有何塞·Valim Mocks and explicit contracts伟大的作品。它说

始终把“模拟”是一个名词,从来没有一个动词


这意味着你不应该嘲笑的生成功能。你最好创建一个发电机和嘲笑它。

有点像:

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

现在,你们都设置返回无论你从发电机希望。

© www.soinside.com 2019 - 2024. All rights reserved.