2017-08-23 19 views
2

私はエリクシールに新しいです。フェニックスは、テスト内でネストされた要素にアクセスする際にいくつかの問題を抱えています。私はこれを短くしたいエリクシルのマップでリスト内のネストされた要素へのアクセス

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 

:私は、コントローラをテストしてい、これまでの応答を以下ました:

.[%{"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形式を使用していますが、ユーザデータと属性を取得していますケースでは値の部分を使わずにuser_attrの値を取得する方法は考えられません。

私は前に挿入したIDを持つアバター - >データ - > idという関係のIDをアサートしたいが、この値にアクセスする方法は考えていない。 IDは前に挿入した画像の一部ですので

assert XXX == picture.id 

XXXを取得するにはどうすればよいですか?

誰かが私を助けることを願っています。去年はJavaとC#だけでRubyは決してできませんでしたが、今は何とかエリクサーになっています:/

ありがとう。

答えて

2

これを行うにはget_in/2を使用できます。

iex()> list 
[%{"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"}] 

iex()> [map] = list 
[%{"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"}] 


iex()> get_in map, ["attributes", "first_name"] 
"Timmy 96" 
iex()> get_in map, ["attributes", "last_name"] 
"Assistant" 
iex()> get_in map, ["relationships", "avatar", "data", "id"] 
"011300fd-ca98-42b4-\n9561-f1cdc93d2d25" 
+0

ありがとう:

はテストとパターンマッチングについては、こちらをご覧ください。どちらの答えも理にかなっていますが、私はあなたのソリューションを使いました。 Thumbs up :) – Sardoan

+1

@Sardoanあなたが解決策を見つけたので、この答えを正しいものとしてマークする必要があります。 – mudasobwa

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 

エリクサーの最も強力な機能の1つは、=演算子(マッチ演算子)によるパターンマッチングです。

上記の例は、match演算子を使用して、期待値のデータ構造が実際の値と一致することをアサートできることを示しています。 https://semaphoreci.com/community/tutorials/introduction-to-testing-elixir-applications-with-exunit

関連する問題