单元测试断言json响应包含一个列表

时间:2017-07-19 16:37:37

标签: unit-testing elixir phoenix-framework

在phoenix框架中编写单元测试时,如何检查json响应是否包含列表。

现有测试失败,因为children已填充。我只想让测试告诉我,我的json响应包含childrenchildren是一个列表。

test "shows chosen resource", %{conn: conn} do
  parent = Repo.insert! %Parent{}
  conn = get conn, parent_path(conn, :show, parent)
  assert json_response(conn, 200)["data"] == %{"id" => parent.id,
    "children" => []}
end

2 个答案:

答案 0 :(得分:2)

我会为此使用三个断言,首先使用模式匹配断言来断言基本结构并提取idchildren

assert %{"id" => id, "children" => children} = json_response(conn, 200)["data"]
assert id == parent.id
assert is_list(children)

请注意,即使地图包含idchildren以外的其他键,此测试也会通过。

答案 1 :(得分:2)

使用[json schema] [2],您可以生成一个与(https://github.com/jonasschmidt/ex_json_schema)一起使用的json来验证完整的json结构。

iex> schema = %{
  "type" => "object",
  "properties" => %{
    "foo" => %{
      "type" => "string"
    }
  }
} |> ExJsonSchema.Schema.resolve

 iex> ExJsonSchema.Validator.valid?(schema, %{"foo" => "bar"})

并记住每个测试只有一个逻辑断言“(http://blog.stevensanderson.com/2009/08/24/writing-great-unit-tests-best-and-worst-practises/