如何在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
)。否则,您可以在编译时手动定义它
有关更多信息,请参阅