簡體   English   中英

Elixir:配置混合項目以始終將字符列表打印為列表?

[英]Elixir: Configure a mix project to always print charlists as lists?

在測試我的 Phoenix 應用程序時,我經常遇到需要比較預期記錄 ID 列表和實際記錄 ID 列表的情況。 錯誤解釋起來很乏味,因為 Elixir 不斷將 integer 列表打印為字符列表,所以我的測試 output 看起來像:

     Assertion with == failed
     code:  assert H.sort(Enum.map(list1, &(&1.id()))) == H.sort(Enum.map(list2, &(&1.id())))
     left:  'stu'
     right: 'st'

這促使我重寫我的測試以避免比較整數列表,這是可以容忍的,但只是聳聳肩並用這樣的語言尋找解決方法是一種恥辱。 所以我想知道是否有辦法告訴 Elixir/Mix始終將 integer 列表打印為列表,而不是作為 charlists/charstrings。 我編寫了 Ruby 風格的 Elixir 並且我幾乎從不使用 charlists,對我來說,它們主要是一個可以解決的問題。

感謝這個答案,我知道有一種方法可以將 IEx 配置為始終將 integer 列表打印為列表。 有沒有辦法在混合中這樣做,或者在 Elixir 本身中全局這樣做,所以mix test將采用這種行為?

這在ExUnit中是不可配置的,它歸結為調用Inspect.Algebra.to_doc/2並將Inspect.Opts硬編碼為%Inspect.Opts{width: width}

在您自己的代碼中,您總是可以在調用inspect/2時傳遞第二個參數,例如

IO.inspect('ABC', charlists: :as_list)
#⇒ [65, 66, 67]

charlists 的“人性化”可能是 Elixir 中最令人困惑的問題之一。 正如@Aleksei指出的那樣,這在ExUnit中是不可配置的(盡管您可以通過在iex文件中添加IEx.configure(inspect: [charlists: :as_lists])來配置.iex.exs )。

但是,您不需要重寫測試 請記住,打印值的方式只是數據的視圖 影響數據的存儲方式

您的示例斷言失敗,因為'stu'不等於'st'就像[115, 116, 117]不等於[115, 116]

看下面的代碼:

iex> [115, 116, 117] === 'stu'
true

左側和右側是 100% 完全等效的。 單引號僅允許人們更輕松地輸入數據。

在您的特定情況下,您可能想查看MapSet ,特別是如果您的 ID 列表是唯一的。 然后,您可以避免在比較之前進行笨拙/脆弱的排序。 使用MapSet ,您只需比較兩組是否相等。 例如:

expected_ids = MapSet.new([115, 116, 117])
actual_ids = MapSet.new(some_function_output)

assert MapSet.equal?(actual_ids, expected_ids)

這可能有助於避免冗長的跟蹤由 charlists 引起的錯誤。 您的情況的另一個選擇可能是在映射期間將整數轉換為字符串,例如Enum.map(list1, fn x -> to_string(x.id) end)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM