首页 > 解决方案 > Elixir 测试:确保模块定义回调

问题描述

我正在尝试编写一个测试来验证行为是否定义了它应该定义的回调。我该怎么做?

我有一个定义回调的模块,例如:

defmodule MyModule do
    @callback my_callback(arg :: binary) :: any
end

我想确保my_callback/1MyModule.

由于@callback是一个属性,我尝试调用MyModule.__info__(:attributes),但响应中不存在回调。

标签: testingcallbackelixirbehavior

解决方案


尽管在提出问题时除了在已弃用的模块中之外没有记录,但现在在Typespecs中记录了这一点:

检查行为

和属性用于创建定义模块上可用的功能@callback。此函数可用于检索该模块定义的回调和可选回调。@optional_callbackbehaviour_info/1

例如,对于MyBehaviour上面“可选回调”中定义的模块:

MyBehaviour.behaviour_info(:callbacks)
#=> [vital_fun: 0, "MACRO-non_vital_macro": 2, non_vital_fun: 0]
MyBehaviour.behaviour_info(:optional_callbacks)
#=> ["MACRO-non_vital_macro": 2, non_vital_fun: 0]

使用iex时,IEx.Helpers.b/1助手也可用。


推荐阅读