2016-08-05 9 views
2

GenServerは基本的にはcastしか扱っていません。Erlang/Elixirで関数を動的に定義する方法

私はサーバーの状態を追跡する機能はありません(私は必要ありません)。

問題:本番環境では必要ありませんが、テストが必要です。

私はhandle_callをテストスーツのサーバー状態を追跡するために定義することができますが、これは間違っています。

実行時に私のテストスーツの前にこのhandle_call関数を追加することを考えたので、キャストシーケンスの特定のケースでサーバーの状態を追跡できます。

有用なデータを見つけようとしましたが、何も見つかりませんでした。

答えて

4

GenServerはOTPの特別なプロセスなので、:sysモジュールのツールを使用して、状態と動作を調べることができます。これらの関数の1つは:sys.get_state/1です。この関数を使用すると、サーバーに特定のコールバックを定義せずにプロセスの状態にアクセスできます。

0

コンパイルされたモジュールに、指定されたhandle_call関数を本番環境で表示させたくないということを意味しますか?たとえば、eunitでは、テストのためだけに存在させたい機能を、ifdef(TEST)./endif.で囲むことができます。 rebar3を使用していて、rebar3 eunitでeunitテストを実行している場合、rebar3は自動的にTESTを定義しますので、これだけで済みます(eunit.hrlも含める)。それ以外の場合は、コンパイル時に手動で定義することができます。

詳細については、http://erlang.org/doc/apps/eunit/chapter.htmlを参照してください。

関連する問題