我试图模拟函数多个调用,因此它每次都会返回特定的不同值。我不太熟悉长生不老药和功能概念。
defmodule Roller do
def roll do
1..10
|>Enum.random()
end
end罗尔每次呼叫都会返回一个随机数。
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试过了。我想用最简单的方法来做这样的事情。如果不必在任何地方保存某些状态,或者为每个调用运行单独的进程,那就太好了。我知道,“灵丹妙药”的思维方式可能与我所持的客观范式思维方式略有不同。测试模块的最正确的方法是什么?
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发布于 2021-12-29 16:02:22
我找到了一个可行的解决方案,但我不确定是否对此感到满意:
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有什么更好的方法来解决这个问题吗?
https://stackoverflow.com/questions/70497235
复制相似问题