【问题标题】:Elixir Testing: Ensure a module defines a callbackElixir 测试:确保模块定义回调
【发布时间】:2019-08-26 22:49:58
【问题描述】:

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

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

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

我想确保my_callback/1MyModule 定义。

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

【问题讨论】:

    标签: testing callback elixir behavior


    【解决方案1】:

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

    检查行为

    @callback@optional_callback 属性用于创建 behaviour_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 助手也可用。

    【讨论】:

      【解决方案2】:

      MyModule.behaviour_info(:callbacks).

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

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

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

      花哨的发现:也可以define the behaviour manually

      【讨论】:

      • 有趣。所以似乎@callback 属性用于创建behaviour_info/1 函数。
      • 文档在 erlang 端:erlang.org/doc/reference_manual/…
      • 啊,这就是为什么我无法找到在 Elixir 代码中创建 behaviour_info/1 的原因。谢谢!
      • 这现在记录在Typespecs中,请参阅我的回答。
      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2020-05-06
      • 1970-01-01
      • 2016-02-24
      相关资源
      最近更新 更多