首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Mock或Mox在Elixir中模拟连续函数调用

用Mock或Mox在Elixir中模拟连续函数调用
EN

Stack Overflow用户
提问于 2021-12-27 15:13:43
回答 1查看 302关注 0票数 1

我试图模拟函数多个调用,因此它每次都会返回特定的不同值。我不太熟悉长生不老药和功能概念。

代码语言:javascript
复制
defmodule Roller do
  def roll do
      1..10
      |>Enum.random()
  end
end

罗尔每次呼叫都会返回一个随机数。

代码语言:javascript
复制
defmodule VolunteerFinder do
  import Roller

  def find(list) do
    find(list, []);
  end

  defp find([] = _list, result) do
    result
  end

  defp find([head | tail] = _list, result) do
    result = [%{name: head, score: Roller.roll()} | result]
    find(tail, result)
  end
end

因此,假设list包含多个元素,则辊被调用2次。在我的测试中,我需要控制它。

我和Mock试过了。我想用最简单的方法来做这样的事情。如果不必在任何地方保存某些状态,或者为每个调用运行单独的进程,那就太好了。我知道,“灵丹妙药”的思维方式可能与我所持的客观范式思维方式略有不同。测试模块的最正确的方法是什么?

代码语言:javascript
复制
defmodule VolunteerFinderTest do
  use ExUnit.Case

  import Mock
  import Roller

  test_with_mock(
    "Find volunteer for list with one element",
    Roller,
    [roll: fn() -> 5 end]
  ) do
    assert VolunteerFinder.find(["John"]) == [%{name: "John", score: 5}]
  end


  test_with_mock(
    "Find volunteer for list with two elements",
    Roller,
    [roll: fn
       () -> 2
       () -> 5
    end]
  ) do
    assert VolunteerFinder.find(["John", "Andrew"])
    == [%{name: "Andrew", score: 5}, %{name: "John", score: 2}]
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-29 16:02:22

我找到了一个可行的解决方案,但我不确定是否对此感到满意:

代码语言:javascript
复制
  test_with_mock(
    "Find volunteer for list with two elements",
    Roller,
    [roll: fn () -> mock_roll end]
  ) do
    send self(), {:mock_return, 1}
    send self(), {:mock_return, 5}

    assert VolunteerFinder.find(["Sergey", "Borys"])
    == [%{name: "Borys", score: 5}, %{name: "Sergey", score: 1}]
  end

  def mock_roll do
    receive do
      {:mock_return, value} ->
        value
    after
      0 ->
        raise "No mocked returns received"
    end
  end

有什么更好的方法来解决这个问题吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70497235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档