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

如何在Erlang/Elixir中动态定义函数,erlang,elixir,Erlang,Elixir,我有GenServer,它基本上只处理cast 所以我并没有任何跟踪服务器状态的函数(因为我不需要它) 问题是:虽然我在生产中不需要它,但我需要一些测试 我可以定义handle\u call来跟踪测试套件中的服务器状态,但是,这感觉是错误的 我想在测试之前在运行时添加这个handle\u调用函数,这样我就可以在某些情况下跟踪服务器状态 试图通过谷歌搜索找到一些有用的数据,但什么也没找到。由于GenServer是一个OTP特殊进程,您可以使用:sys模块中的工具来反思它的状态和行为。其中一个函数是

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

所以我并没有任何跟踪服务器状态的函数(因为我不需要它)

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

我可以定义
handle\u call
来跟踪测试套件中的服务器状态,但是,这感觉是错误的

我想在测试之前在运行时添加这个
handle\u调用
函数,这样我就可以在某些情况下跟踪服务器状态


试图通过谷歌搜索找到一些有用的数据,但什么也没找到。

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

您的意思是不希望编译的模块包含给定的
handle_call
函数出现在生产中吗?例如,在eunit中,您可以使用
ifdef(TEST)围绕您只想用于测试的函数。
/
endif.
。如果您使用的是rebar3,并且使用
rebar3 eunit
运行eunit测试,那么rebar3会自动为您定义
TEST
,因此这就是您所要做的一切(还包括
eunit.hrl
)。否则,您可以在编译时手动定义它

有关更多信息,请参阅