使用elixir中的地图访问列表中的嵌套元素

时间:2017-08-23 22:51:37

标签: list maps elixir

我是elixir a phoenix的新手,在测试中访问嵌套元素时遇到了一些问题。我正在测试一个控制器并且在响应之后到目前为止:

.[%{"attributes" => %{"first_name" => "Timmy 96", "last_name" => 
"Assistant"},
"id" => "bca58c53-7c6e-4281-9bc8-0c4616a30051",
"relationships" => %{"avatar" => %{"data" => %{"id" => "011300fd-ca98-42b4-
9561-f1cdc93d2d25",
"type" => "pictures"}}}, "type" => "users"}]

我正在使用JSON-API格式进行响应,并使用userdata获取属性:

user_attr = Enum.filter(includes, fn(item)->
    item["relationships"]["avatar"] != nil
end)
IO.inspect user_attr
case Enum.fetch(user_attr ,0) do
  {:ok, value} ->
    assert value["attributes"]["first_name"] == user.first_name
    assert value["attributes"]["last_name"] == user.last_name
  {_} ->
    assert false
end

我想缩短这一部分,不想使用案例,但不知道如何在不使用案例中的值部分的情况下获取user_attr的值。

我也希望asser关系的id - >头像 - >数据 - >我之前插入了id的id,但不知道如何访问此值。 id是我之前插入的图片的一部分,所以我想

assert XXX == picture.id

但是如何获得XXX?

希望有人可以帮助我。去年只有Java和C#,从来没有Ruby,现在我得到了elixir:/

感谢。

2 个答案:

答案 0 :(得分:3)

您应该尝试更多地使用模式匹配。

# fixture data.
user = %{first_name: "Timmy 96", last_name: "Assistant"}
picture = %{id: "011300fd-ca98-42b4-\n9561-f1cdc93d2d25"}
value = %{
      "attributes" => %{"first_name" => "Timmy 96", "last_name" => "Assistant"},
      "id" => "bca58c53-7c6e-4281-9bc8-0c4616a30051",
      "relationships" => %{
        "avatar" => %{
          "data" => %{
            "id" => "011300fd-ca98-42b4-\n9561-f1cdc93d2d25",
            "type" => "pictures",
          },
        },
      },
      "type" => "users",
    }

assert %{"attributes" => attributes} = value
# ensure the expected value match with actual value and than bind the attributes variable with actual attributes map.
assert %{"first_name" => user.first_name, "last_name" => user.last_name} == attributes

assert %{"relationships" => %{"avatar" => %{ "data" => avatar_data}}} = value
assert %{"id" => picture.id, "type" => "pictures"} == avatar_data

Elixir最强大的功能之一是通过=运算符(匹配运算符)进行模式匹配。

上面的例子向您展示我们可以使用match运算符来断言期望值的数据结构与实际值匹配。

了解有关测试和模式匹配的更多信息: https://semaphoreci.com/community/tutorials/introduction-to-testing-elixir-applications-with-exunit

答案 1 :(得分:2)

您可以使用get_in/2执行此操作。

.\scripts\code.bat