2016-06-24 13 views
1

私のアプリケーションコールバックはユニットテストと競合するスーパーバイザを開始します。アプリケーションコールバックを呼び出さずにユニットテストを実行するにはどうすればいいですか?

コールバックでは、プロセスが既に開始されているためユニットテストを実行しようとすると{:error, {:already_started, #PID<0.258.0>}}のようなものが発生します。

:dev:prodのアプリケーションコールバックを実行して、:testの環境を起動コードできれいに保つことはできますか?私はこのような何かを探しています

def application do 
[ 
    applications: [:logger], 
    mod: {MyApplication, [], only: [:dev, :prod]} 
] 

only: [:dev, :prod] - これは作品

+0

「:dev::prod」のみを意味しましたか? – Dogbert

+0

@Dogbertあなたは正しいです。質問を解決します。 –

答えて

1

これは、ここで、この場合のテストを処理するための正しい方法ですが、場合、私は知らないが、あなたはあなたが求めているものを行うことができます方法です以下のデモは、私がMyApp.start/2に以下を追加:

IO.puts "starting app..." 

はデモ:

$ MIX_ENV=dev mix 
starting app... 
$ MIX_ENV=prod mix 
starting app... 
$ MIX_ENV=test mix # no output 
0

一つの解決策が欠落しているが、テストスイートを実行する前にそのプロセスを殺すことです。たとえば、次のようなことを行うことができます。

setup do 
    Process.exit(pid, :kill) 
end 

test "do something..." do 
    assert 1 == 1 
end 

これにより、テストが実行される前にそのプロセスが既に強制終了されます。

mix.exsで:については

def application do 
    rest = if(Mix.env == :test, do: [], else: [mod: {MyApp, []}]) 
    [applications: [:logger]] ++ rest 
end 

+0

これは間違いなく動作しますが、私はすべてのテストをコードのクリーニングで設定することを避けたいと思います。しかし、返信をありがとう。 –

関連する問題