2016-09-29 5 views
3

엘릭서로 기본 코드 테스팅을 배우려고 시도하고 비동기 함수 테스트 (genserver의 handle_info 및 캐스트)에 대한 내 머리를 감싸는 데 어려움이 있습니다.GenServer 비동기 통합 테스팅

작동하지만 잘못된 것으로 보이는 한 가지 방법은 비동기 기능을 캐스팅 한 후에 :timer.sleep(x)을 사용하는 것입니다.

예를 들어 상태의 항목 목록을 처리하고 외부 API에서 데이터를 가져 오는 다른 모듈로 호출을 보내고 완료되면 메시지 (api 데이터)가 다시 동일한 genserver로 전송됩니다.

이것을 테스트하는 가장 좋은 방법은 무엇입니까? 테스트 중 genserver 메시지/사서함을 모니터링 할 수 있습니까?

편집 :

Process.send_after(self(), :started, 0) 

그리고 : 또 다른 예를 들어, 나는이 DB에서 초기 상태를 얻기 위해 할 초기화에 말은

defhandleinfo :started, state: state, do: new_state(UserServerStarted.get_data(state)) 

내가 다른이 있습니까 : 같은 외모를 시작 옵션을 누른 다음 : UserServerStarted가 올바른 것을 반환했는지 확인하는 timer.sleep? 모듈/유닛을 개별적으로 테스트 할 수는 있지만 전체 통합 테스트를 수행하고 싶습니다.

... SETUP - Supervisor start UserServer... 

    test "spin up server and inital tree after user registers", % 
    {user: user} do 
    :timer.sleep(500) 
    assert %{"default" => [nil]} == GenServer.call(UserServer.via_tuple(user.id), :get) 
    end 
+0

'Process.info (PID 나는 시험에서 추적 할 프로세스를 등록하여 그것을 해결하기 위해 관리 , : messages)'하지만 GenServer가 이전 메시지를 처리하는 동안에는 메시지를 수신하자마자 GenServer가 메시지를 처리하기 때문에 GenServer와 제대로 작동하지 않습니다. – Dogbert

답변

2

내가 최근에 비슷한 문제로 분투 : 여기

내가 지금 뭐하는 거지 방법이다.

defmodule Foo 
    def bar do 
    pid = spawn fn -> consume(channel, tag, payload) end 
    if !Process.whereis(:worker) do 
     Process.register(pid, :worker) 
    end 
    end 
end 

을 그리고 테스트에서 :

test "bar" do 
    # < Setup code that triggers your process under test goes here > 

    # I put this here because I noticed that sometimes the process would not be 
    # fast enough to be registered - this was a quick fix. 
    :timer.sleep(100) 

    ref = Process.monitor(Process.whereis(:worker)) 

    # assert_receive will block the test until your registered process exits, 
    # or 10 seconds have passed (then something is wrong with the external service perhaps and the test will fail) 
    assert_receive {:DOWN, ^ref, :process, _, :normal}, 10000 

    # At this point the process has exited, continue with whatever assertions you want to make 
end 
사용 사서함 메시지를 얻을 수 있습니다
관련 문제