0

채널 테스트에서 ecto 구조체를 json 응답에 자동으로 직렬화하는 방법은 무엇입니까? 내가 documentation에서 볼 수 있듯이 answertutorial에서 내가 Poison.Encoder을 사용할 때 모델에서 트랜스 포트를 통해 전달 된 메시지가 인코딩되어야한다는 것을 알았습니다.Phoenix.Secket.Broadcast 페이로드에서 struct를 테스트하거나 직렬화하는 방법은 무엇입니까?

예 모델 : 채널 기능 중 하나

use PhoenixTrello.Web, :model 
    # ... 

    @derive {Poison.Encoder, only: [:id, :first_name, :last_name, :email]} 

    # ... 
end 

방송 : 마지막으로

broadcast_from! socket, "card:created", %{card: card} 

테스트에 방송에서 페이로드를받을 시도 :

assert_receive %Phoenix.Socket.Broadcast{topic: ^t1, event: "card:created", payload: ^payload} 

다음이 일치하지 상승하면 페이로드 직렬화되지 않은 구조체 오류 (필자는 파생 된 모델 filelds 일치하도록 노력하고있어) : 0 는 클라이언트 응용 프로그램 인 것처럼

Process mailbox: 
    %Phoenix.Socket.Broadcast{event: "card:created", payload: %{card: %PhoenixTrello.Card{__meta__: #Ecto.Schema.Metadata<:loaded, "cards">, ... user: #Ecto.Association.NotLoaded<association :user is not loaded>, user_id: 1833}}, topic: "boards:1833"} 
어떻게 시험에 직렬화 된 JSON 메시지를 얻으려면?

+0

가 왜'Phoenix.Socket.Broadcast'를받을 클라이언트를 기대합니까?! 우리가 물러서는 "Hello world"를 할 때, 우리 동료들은 물러나는 자체가 아닌 "Hello world"라는 단일 메시지를 듣게됩니다. – mudasobwa

답변

0

나는 다음 Poison.encode! 첫번째 assert_receive 원시 메시지를 거라고 및 제 assert을 수행

payload = "{\"card\": ...}" 
assert_receive %Phoenix.Socket.Broadcast{topic: ^t1, event: "card:created", payload: raw_payload} 
assert Poison.encode!(raw_payload) == payload 
+0

그러나 왜 나는 이미 인코딩 된 페이로드를 얻을 수 없습니까? 나는 그것이 Phoenix에 의해 코드화되어 있고 어디에서 완전한 응답을 가로 챌 수 있는지 궁금합니다. – luzny

+0

[this] (https://github.com/phoenixframework/phoenix/blob/074a584ae324f78fa89f7ca097c38f8805d3021e/lib/phoenix/transports/websocket.ex#L190-L192) 라인이 JSON 인코딩을 처리한다고 생각합니다. Elixir 메시지가 테스트 프로세스로 전송 된 후, 내가 알 수있는 한 매우 늦게 발생합니다. – Dogbert