Elixir 测试:确保模块定义回调
Elixir Testing: Ensure a module defines a callback
我正在尝试编写一个测试来验证行为是否定义了它应该定义的回调。我应该怎么做?
我有一个定义回调的模块,例如:
defmodule MyModule do
@callback my_callback(arg :: binary) :: any
end
我想确保 my_callback/1
由 MyModule
定义。
由于 @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.
我正在尝试编写一个测试来验证行为是否定义了它应该定义的回调。我应该怎么做?
我有一个定义回调的模块,例如:
defmodule MyModule do
@callback my_callback(arg :: binary) :: any
end
我想确保 my_callback/1
由 MyModule
定义。
由于 @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 abehaviour_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
, theIEx.Helpers.b/1
helper is also available.