簡體   English   中英

elixir phoenix - 測試期間的協議錯誤

[英]elixir phoenix - protocol error during testing

我有一個簡單的數據:

{
    "name" : "example task",
    "description":"example description",
    "type" : "task",
    "details" : {
        "__type__":"task",
        "amount":20.00,
    },
    "publish" : true
}

當我用郵遞員測試我的 API 時,一切正常。 但是當我為控制器編寫單元測試時,我得到了這個錯誤:

  1) test create_task: assign task (OkBackendWeb.TaskControllerTest)
     test/ok_backend_web/controllers/task_controller_test.exs:87
     ** (Protocol.UndefinedError) protocol Phoenix.Param not implemented for 20.0 of type Float. This protocol is implemented for the following type(s): Any, Atom, BitString, Integer, Map
     code: conn = post(conn, Routes.item_path(conn, :create_all, @create_attrs))
     stacktrace:
       (phoenix 1.5.13) lib/phoenix/param.ex:121: Phoenix.Param.Any.to_param/1
       (plug 1.12.1) lib/plug/conn/query.ex:275: Plug.Conn.Query.encode_value/2
       (plug 1.12.1) lib/plug/conn/query.ex:246: Plug.Conn.Query.encode_pair/3
       (plug 1.12.1) lib/plug/conn/query.ex:262: anonymous fn/3 in Plug.Conn.Query.encode_kv/3
       (elixir 1.13.1) lib/enum.ex:1213: anonymous fn/3 in Enum.flat_map/2
       (stdlib 3.14) maps.erl:233: :maps.fold_1/3
       (elixir 1.13.1) lib/enum.ex:2408: Enum.flat_map/2
       (plug 1.12.1) lib/plug/conn/query.ex:266: Plug.Conn.Query.encode_kv/3
       (plug 1.12.1) lib/plug/conn/query.ex:262: anonymous fn/3 in Plug.Conn.Query.encode_kv/3
       (elixir 1.13.1) lib/enum.ex:4086: Enum.flat_map_list/2
       (elixir 1.13.1) lib/enum.ex:4087: Enum.flat_map_list/2
       (plug 1.12.1) lib/plug/conn/query.ex:266: Plug.Conn.Query.encode_kv/3
       (plug 1.12.1) lib/plug/conn/query.ex:204: Plug.Conn.Query.encode/2
       (ok_backend 0.1.0) lib/ok_backend_web/router.ex:1: OkBackendWeb.Router.Helpers.segments/5
       (ok_backend 0.1.0) lib/ok_backend_web/router.ex:1: OkBackendWeb.Router.Helpers.item_path/3
       test/ok_backend_web/controllers/task_controller_test.exs:91: (test)

這是我的測試前:

defmodule ExampleWeb.TaskControllerTest do
  use ExampleWeb.ConnCase

  alias Example.Users
  alias Example.Items

  @create_attrs %{
    "name" => "milk with cow",
    "description"=> "cow are cute.",
    "type" => "task",
    "details" => %{
        "amount"=> 20.00,
    },
    "publish" => true
}
  setup %{conn: conn} do
    {:ok, conn: put_req_header(conn, "accept", "application/json")}
  end

  describe "create_task:" do
    test "create task", %{conn: conn} do
      %{ token: [ token ] } = get_poster_token(conn)
      conn = post(conn, Routes.item_path(conn, :create_all, @create_attrs))
      assert json_response(conn, 200)["status"] == 1
    end

  end

  defp get_poster_token(conn) do
    conn = post(conn, Routes.passwordless_path(conn, :user_auth, @user_poster))
    token = get_resp_header(conn, "authorization")
    %{token: token}
  end

我該如何解決這個問題?

您將 POST 數據作為參數傳遞給 routes 函數。 它應該是post/3的單獨參數:

post(conn, Routes.item_path(conn, :create_all), item: @create_attrs)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM