2017-11-07 28 views
0

私は現在、Taskを監督しているSupervisorを持っています。タスクは、非同期に電子メールを送信し、データベースを更新する役割を担います。私はタスクがテストと無関係ですが、これらのタスクを開始する関数をテストしています。テスト中に問題を引き起こすタスク

私がテストを実行すると、Ecto.StaleEntryErrorがSTDOUTで表示されています。テストが終了した後、タスクが実行される前にEctoがレコードを削除するので、これは起こっていると私は信じています。レコードを更新しようとすると存在しないため、Ecto.StaleEntryErrorが発生します。

補足として、テストは失敗しません。スタックトレースのみを出力します。

タスクを何らかの形で実行しないようにするか、別の方法があるかどうかはわかりません。

+0

スーパーバイザーと何が関係しているのか分かりません。スーパーバイザを実際に起動しなくても、ただ1つのスーパーバイザ機能をテストしようとしていますか? – Tyler

+0

私はテストに無関係なタスクを実行しないようにしたいのですが、テスト出力にスタックトレースを投げています。スーパーバイザーが実行されてタスクが実行されないようにする方法があると思いました。私はこれが正しいアプローチであるかどうかわからないし、もしそれがどうなるかわからないのであれば。 – anthonator

答えて

2

これはexplicit contractの完璧な使用例です。

あなたSupervisorは設定から​​の読み込み、異なるTask実装を使用するようにしてください:

@task Application.get_env(:my_app, :task_impl) 

@task.asyncの代わりTask.asyncを実行します。

defmodule TaskStub do 
    def async(_), do: :ok 
end 

ワン:代わり

TaskStubは、次のようになります
config :my_app, :task_impl, TaskStub 

TaskStubモジュールを使用する

config :my_app, :task_impl, Task 

test.exs:また、適切な実装を宣言するconfig/proc.exsを作りますを参照することもできますインスピレーションのためののドキュメント。

関連する問題