2017-08-22 2 views
1

J'ai donc configuration de test comme suit en utilisant Elixir/Phoenix et le cadre de tests spéc:Comment définir le corps d'une demande PUT Elixir/Phoenix avec Plug.Adapters.Test.Con

let :response do 
    resp = build_conn() |> put("/kites/#{id_function()}", [horizontal: "more", default: true]) 
    Poison.Parser.parse!(resp.resp_body, keys: :atoms!) 
end 

Quand j'appelle réponse(), j'obtiens une erreur telle que:

** (Poison.EncodeError) unable to encode value: {Plug.Adapters.Test.Conn, %{chunks: nil, method: "PUT", owner: #PID<0.46.0>, params: nil, ref: #Reference<0.0.5.1528>, req_body: ""}} 
     (poison) lib/poison/encoder.ex:354: Poison.Encoder.Any.encode/2 
     (poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3 
     (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3 
     (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map.encode/3 
     (poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3 
     (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3 
     (poison) lib/poison/encoder.ex:214: Poison.Encoder.Map.encode/3 
     (poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3 


1 examples, 1 failures 

Finished in 1.0 seconds (0.76s on load, 0.24s on specs) 

Que se passe-t-il? Est-ce que je passe les paramètres à PUT demande correctement?

+0

Est-ce que tout le message d'erreur? Étrange qu'il n'y a pas de ligne dans la pile de votre code de test. – Dogbert

Répondre

1

Il me semble que vous voulez encoder la carte pendant que vous avez un tuple.

Vous avez:

{Plug.Adapters.Test.Conn, %{chunks: nil, method: "PUT", owner: #PID<0.46.0>, params: nil, ref: #Reference<0.0.5.1528>, req_body: ""}} 

un tuple avec {some_val, %{}%{} est une carte. Vous voulez probablement encoder juste une carte, donc c'est le deuxième élément. Vous pouvez prendre deuxième élément de tuple en utilisant: elem(resp.resp_body, 1)

Peut-être qu'il fonctionnera:

Poison.Parser.parse!(elem(resp.resp_body, 1), keys: :atoms!) 

Ou tout simplement créer une carte de avec:

Enum.into(resp.resp_body, %{}) 

Je ne sais pas si je Je montre au bon endroit, mais il semble que resp.resp_body a plus à l'intérieur que prévu.


Une chose, rappelez-vous que les clés: :atoms! réutilise atomes existants, à savoir si :some_var n'a pas été attribué avant l'appel, vous rencontrerez un message d'erreur d'argument.

Alors peut-être juste supprimer peut aider:

Poison.Parser.parse!(resp.resp_body) 
+0

L'erreur dans la question est 'Poison.EncodeError'. Je ne pense pas que cette erreur puisse être émise par 'Poison.Parser.parse!'. – Dogbert

+0

Merci pour l'aide, la cause profonde a fini par être il y avait un Ecto.Schema.Struct dans la réponse que j'essayais d'analyser. – Nona