2016-07-06 10 views
1

http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/記事を読んだ後、私は私のコードを持っている:私はテスト中の「モック」残りのアダプタと異なる結果とエラーコードを返すためにそれを使用していエリクサーApplication.set_envと並行性のレースコンディション

defp rest_adapter, do: Application.get_env(:app_name, :rest_adapter) 

しかし、これらのテストでは、テストケースごとに異なるrest_adapterを設定しているため、競合状態が発生します。

場合によっては意図した通りに動作することもありますが、時にはこのテスト用に異なるrest_adapterを「キャッチ」しないことがあります。

どのように問題を回避できますか?

+0

あなたは 'async:true'でテストを実行していますか? – TattdCodeMonkey

+0

私はそれを試してみました。 – squixy

答えて

0

この問題は、アプリケーション環境がグローバルであることに起因しています。アプリケーション環境は複数の場所で同時に異なる値に変更することはできません。 最も簡単な解決策は、async: trueを削除して並行テストを無効にすることですが、同時に実行することはできないため、テストが遅くなります。

幸いにも他にも解決策があります。最も単純なもの(そしておそらく最もエレガントなもの)は、アダプターをオプションとして関数を使用する関数に渡すことです。何も指定されていない場合は、アプリケーション環境の関数を使用します。もう1つの解決策は、アプリケーション環境に依存するのではなく、プロセス辞書を使用してアダプターを渡すことです(同じプロセスで呼び出しが行われる場合)。

さらに、ハイブリッドソリューションを適応させることも可能です。例えば、実際のアダプタとプロセスディクショナリからの応答を返すアダプタの2つがあります。次に、テストで常にプロセス辞書を使用し、関数を呼び出す前に予期される応答を入れてください。

最後に、エンドポイントを呼び出すコードを置き換えるのではなく、ちょっと違ったレイヤーでHTTPエンドポイントを提供するようなものがあります(これはテストでのhttp呼び出しを置き換える通常の方法です)。