如何在Erlang / Elixir中动态定义函数

时间:2016-08-05 19:11:41

标签: erlang elixir

我有GenServer,它基本上只处理cast

所以我没有跟踪服务器状态的任何功能(因为我不需要它)。

问题:虽然我在生产中不需要它,但我需要进行一些测试。

我可以定义handle_call只是为了跟踪测试服中的服务器状态,但是,这感觉不对。

我想在运行之前在运行时添加这个handle_call函数,所以我可以在某些强制转换序列的情况下跟踪服务器状态。

试图找到一些有用的数据谷歌搜索,但没有找到任何东西。

2 个答案:

答案 0 :(得分:4)

由于GenServer是一个OTP特殊过程,您可以使用:sys模块中的工具来检查它的状态和行为。其中一个函数是:sys.get_state/1,它允许您访问进程的状态,而无需在服务器中定义任何特定的回调。

答案 1 :(得分:0)

您的意思是您不希望编译的模块包含要在生产中出现的给定handle_call函数吗?例如,在eunit中,您可以使用ifdef(TEST). / endif.包围您希望存在的功能以进行测试。如果您正在使用rebar3,并使用rebar3 eunit运行eunit测试,则rebar3会自动为您定义TEST,这样您就可以完成所有操作(以及包含eunit.hrl)。否则,您可以在编译时手动定义它。

有关详细信息,请参阅http://erlang.org/doc/apps/eunit/chapter.html