假设我的函数返回一个map,并且可能会随机生成一些值。我希望能够至少再次测试输出类型,换句话说 - 从doctest级别检查天气返回值是一张地图。最终它包含特定的键。它甚至可能吗?函数调用可能如下所示:
iex> MyApp.function(params, opts)
%{_}
答案 0 :(得分:2)
输出不能是模式,但您可以使用is_map
或match?
宏,模式为%{}
,如果两者都返回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
。在这种情况下,从函数返回的随机值将是相同的(在不同的运行之间不会改变。)
当然,这个技巧不适用于从第三方服务接收的数据。