【问题标题】:How to test a controller action that expects to receive a JSON array via a POST request?如何测试期望通过 POST 请求接收 JSON 数组的控制器操作?
【发布时间】:2018-10-13 23:02:50
【问题描述】:

这应该很简单,但我就是不知道我应该做什么。我有一个这样的控制器动作:

def submit(conn, %{"id" => id, "_json" => results}) do
...
end

_json 密钥由 Plug.Parsers.JSON 在传入的 JSON 数组上自动生成)

我想测试一下。但是,如果我写

post(conn, experiment_path(conn, :submit, %{})),

或类似的东西

post(
  conn,
  experiment_path(conn, :submit, %{
    "id" => "123",
    "_json" => [%{"a" => 1, "b" => 2}, %{"a" => 3, "b" => 4}]
  })
)

我明白了

 ** (ArgumentError) maps cannot be converted to_param. A struct was expected, got: %{:_json => %{}, "id" => "123"}

令人讨厌的是,我不确定这里到底需要什么类型的结构。我搜索了一下,但大多数在线资源似乎都在谈论如何测试发送 JSON 响应,而不是如何接收 JSON 数据。

我应该如何正确指定控制器接收的JSON数据并编写测试?

【问题讨论】:

  • 我想说你只需要移动一个括号 :) 与其将你的参数传递给experiment_path,不如将​​它作为第三个参数传递给post
  • @AlekseiMatiushkin 哈哈,你是对的。 post 的第三个参数应该只是 id。

标签: json rest testing elixir phoenix-framework


【解决方案1】:

正如 @AlekseiMatiushkin 在 cmets 中提到的,传入的 JSON 应该是 post 的参数,而不是 experiment_path 的参数。

这行得通:

    post(
      conn,
      experiment_path(conn, :submit, "123"),
      %{
        "_json" => [%{"a" => 1, "b" => 2}, %{"a" => 3, "b" => 4}]
      }
    )

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多