Laurent
What is a good way to compare structs?
In some tests, we need to compare 2 structs between each other. However when we build
- the test struct: this is done manually
%{
data_actions: %{A, B}
}
- the core struct, we go through a
data_actions |> Map.from_struct() |> Enum.reduce( ...)
Since OTP 26, Maps aren’t ordered anymore (Taking Control of Map Sort Order in Elixir · The Phoenix Files) so the result is random (in the resulting struct, the data_actions have a random order).
Is there any way to compare a struct recursively, without considering the values order? What is the elixir way to do it clean?
Most Liked
christhekeele
The == operator does not care about order when comparing maps. This applies for structs too.
%{key1: :equal, key2: :values} == %{key2: :values, key1: :equal}
#=> true
%{key1: :unequal, key2: :values} == %{key2: :values, key1: :equal}
#=> false
For tests, you can just assert map1 == map2 as you would expect.
benwilson512
Again, what is wrong with a simple map_a == map_b ?
cevado
just adding to that, if you’re talking about tests… if you pattern match you can just look for the stuff you care for in a particular test run… so that works
assert %{field: :i_care_for} = %MyStruct{field: :i_care_for, other_field: :dont_care_about}
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









