Doctesting一个函数,在每次运行期间返回不同的映射

时间:2017-12-17 16:16:10

标签: elixir doctest

假设我的函数返回一个map,并且可能会随机生成一些值。我希望能够至少再次测试输出类型,换句话说 - 从doctest级别检查天气返回值是一张地图。最终它包含特定的键。它甚至可能吗?函数调用可能如下所示:

iex> MyApp.function(params, opts)
%{_}

2 个答案:

答案 0 :(得分:2)

输出不能是模式,但您可以使用is_mapmatch?宏,模式为%{},如果两者都返回true值是地图。

iex> is_map MyApp.function(params, opts)
true
iex> match? %{}, MyApp.function(params, opts)
true

答案 1 :(得分:1)

尽管@Dogbert的回答是完全正确的,但它并不能在所有情况下使用。当需要提前检查不可预测的值(例如,随机生成)时,仍然可以使用1: [{"name":"film 2","rating":"1"}] 2: [{"name":"film 3","rating":"2"},{"name":"film 4","rating":"2"}] 4: [{"name":"film 6","rating":"4"}] 5: [{"name":"film 1","rating":"5"},{"name":"film 5","rating":"5"}] 来执行此操作。

每次运行测试套件都会打印出 Random seed 值作为最后一行测试运行:

ExUnit

可能会将其录制并传回ExUnit.configure/1。在这种情况下,从函数返回的随机值将是相同的(在不同的运行之间不会改变。)

当然,这个技巧不适用于从第三方服务接收的数据。