我正在尝试测试是否正确转换了从第三方api返回的数据。我在使用Mox时遇到了一些麻烦,因为在数据转换过程中需要击中两个单独的端点。让我通过发布代码来更清楚地解释:
test "players/0 return all active players" do
Statcasters.SportRadarNbaApi.ClientMock
|> expect(:league_hierarchy, fn ->
{:ok, league_hierarchy_map()}
end)
Statcasters.SportRadarNbaApi.ClientMock
|> expect(:team_profile, fn _ ->
{:ok, team_profile_map()}
end)
assert Statcasters.Sports.Nba.get_players() == ["Kevon Looney", "Patrick McCaw"]
end
def get_players do
with {:ok, hierarchy} <- @sport_radar_nba_api.league_hierarchy,
team_ids <- get_team_ids(hierarchy),
players <- get_team_players(team_ids)
do
IO.inspect players
end
end
defp get_team_players(team_ids) do
for team_id <- team_ids do
{:ok, team} = @sport_radar_nba_api.team_profile(team_id)
end
end
忽略以下事实:编写的代码实际上不会通过测试。我正试图找出这是测试失败。
第二个api调用team_profile
在测试中被调用了两次,因为我迭代了两个team_ids
,并且每个team_id
都调用了API。这是预料之中的,但测试并未为此准备,因为我遇到了此错误。
** (Mox.UnexpectedCallError) expected Statcasters.SportRadarNbaApi.ClientMock.team_profile/1 to be called once but it has been called 2 times in process #PID<0.410.0>
这是正确的。我确实调用了两次,但是如何设置测试以期望该API端点将被调用两次?
答案 0 :(得分:3)
third optional argument to expect
是应调用模拟函数的次数。在这种情况下,只需将其设置为2
:
Statcasters.SportRadarNbaApi.ClientMock
|> expect(:team_profile, 2, fn _ ->
{:ok, team_profile_map()}
end)