2017-11-07 22 views
0

현재 Task을 감독하고있는 Supervisor이 있습니다. 작업은 비동기 적으로 전자 메일을 보내고 데이터베이스를 업데이트하는 작업을 담당합니다. 작업이 테스트와 관련이 없지만 이러한 작업을 시작할 함수를 테스트하고 있습니다.테스트 중 문제가 발생하는 작업

테스트를 실행하면 Ecto.StaleEntryError의 출력이 STDOUT으로 인쇄됩니다. 테스트가 끝나고 작업이 실행되기 전에 Ecto가 레코드를 삭제할 것이기 때문에 이런 일이 일어나고 있다고 생각합니다. 레코드를 업데이트하려고 시도하면 레코드가 존재하지 않으므로 Ecto.StaleEntryError이 발생합니다.

부수적으로 테스트가 실패하지 않습니다. 스택 추적 만 인쇄합니다.

나는 어떻게해서든지 작업을 실행하지 못하도록 막아야하는지, 아니면 다른 접근 방법이 있는지 확실하지 않습니다.

+0

관리자와 어떤 관계가 있는지 이해할 수 없습니다. 실제로 감독자를 시작하지 않고 단일 감독 기능을 테스트하려고합니까? – Tyler

+0

내 테스트와 관련이 없으므로 태스크가 실행되지 않도록하고 테스트 출력에 스택 추적을 던지고 싶습니다. 나는 접근이 감독자가 실행하지 못하도록하는 방법을 생각하여 작업이 실행되지 않도록했습니다. 이 방법이 올바른지 확실하지 않은 경우 어떻게해야할지 잘 모르겠습니다. – anthonator

답변

2

explicit contract의 완벽한 사용 사례입니다.

Supervisor는 설정에서 읽기, 다른 Task 구현을 사용하세요 :

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

@task.async 대신 Task.async을 실행합니다. 또한, 적절한 구현을 선언 config/proc.exs합니다

config :my_app, :task_impl, Task 

을하고 TaskStub 같이 보일 수 있습니다 어디 test.exs 대신 TaskStub 모듈

config :my_app, :task_impl, TaskStub 

을 사용 :

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

하나을 참조 할 수도 있습니다. 영감을 얻기위한 문서.