Elixir 测试:确保模块定义回调

Elixir Testing: Ensure a module defines a callback

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

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

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

我想确保 my_callback/1MyModule 定义。

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

MyModule.behaviour_info(:callbacks).

出于未知原因,它仅在已弃用 Behaviour 模块的文档中提及。

请注意,当且仅当模块确实定义了行为时才会导出此函数。

Integer.behaviour_info(:callbacks)       
** (UndefinedFunctionError) function Integer.behaviour_info/1
   is undefined or private

奇妙的发现:也可能 define the behaviour manually

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

Inspecting behaviours

The @callback and @optional_callback attributes are used to create a behaviour_info/1 function available on the defining module. This function can be used to retrieve the callbacks and optional callbacks defined by that module.

For example, for the MyBehaviour module defined in "Optional callbacks" above:

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]

When using iex, the IEx.Helpers.b/1 helper is also available.