0

Wie automatisch Ecto-Struktur zu JSON Antwort im Kanaltest serialisieren? Wie ich in documentationThe event’s message must be a serializable map sehen kann, fand ich in answer und in tutorial, dass, wenn ich Poison.Encoder im Modell verwende, jede über Transport (wie ich verstehe) weitergegebene Schicht kodiert werden sollte.Wie kann man die Struktur in Phoenix.Sticket.Broadcast Payload testen oder serialisieren?

Beispielmodell:

use PhoenixTrello.Web, :model 
    # ... 

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

    # ... 
end 

Uebertragung von einem der Kanalfunktionen:

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

schließlich versucht Nutzlast von Broadcast in Test zu erhalten:

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

dann steigt sie nicht überein Fehler bei nicht serialisierter Struktur in Payload (Ich versuche, nur abgeleitete Modellfilel zu finden):

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"} 

Wie erhalten serialisierte JSON-Nachricht im Test, als ob es die Client-App war?

+0

Warum erwarten Sie einen Client 'Phoenix.Socket.Broadcast' erhalten ?! Wenn wir "Hello world" megeln, hören unsere Kollegen die "Hello world" -Nachricht, anstatt vom Megaphon selbst gestochen zu werden :) – mudasobwa

Antwort

0

Ich würde zuerst assert_receive die rohe Nachricht und dann Poison.encode! und machen einen zweiten assert:

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

Aber warum kann ich die codierte Payload nicht schon bekommen? Ich frage mich, wo es von Phoenix kodiert wird und wo kann ich die vollständige Reaktion abfangen? – luzny

+0

Ich denke [diese] (https://github.com/phoenixframework/phoenix/blob/074a584ae324f78fa89f7ca097c38f8805d3021e/lib/phoenix/transports/websocket.ex#L190-L192) Zeile behandelt die JSON-Codierung. Soweit ich das beurteilen kann, passiert dies sehr spät, nachdem die Elixir-Nachrichten an den Testprozess gesendet wurden. – Dogbert

Verwandte Themen