簡體   English   中英

在Elixir中斷言zip存檔內容的最佳方法是什么?

[英]What is the best way to assert the contents of a zip archive in Elixir?

目前我在做什么:

  1. 通過讓它壓縮文件/目錄來測試功能。 斷言它存在。
  2. 使用:zip.t:zip.tt讓它列出zip文件夾的內容,看看它是否是我所期待的。

不知怎的,我想我錯過了一些東西。 是否更好地測試:zip.table 該功能看起來令人困惑。 有人可以舉例說明如何使用它嗎? 下面是我得到的輸出示例,但我無法弄清楚如何將其變成測試? 對於zip檔案來說,md5sum是更好的測試嗎?

iex(4)> :zip.table('testing.zip')
{:ok,
 [{:zip_comment, []},
  {:zip_file, 'mix.exs',
   {:file_info, 930, :regular, :read_write, {{2015, 7, 15}, {2, 11, 9}},
    {{2015, 7, 15}, {2, 11, 9}}, {{2015, 7, 15}, {2, 11, 9}}, 54, 1, 0, 0, 0, 0,
    0}, [], 0, 444},
  {:zip_file, 'mix.lock',
   {:file_info, 332, :regular, :read_write, {{2015, 7, 15}, {2, 9, 6}},
    {{2015, 7, 15}, {2, 9, 6}}, {{2015, 7, 15}, {2, 9, 6}}, 54, 1, 0, 0, 0, 0,
    0}, [], 481, 152}]}

來自Erlang的:zip模塊並不是很容易使用,我會嘗試為你分解它。

首先,我們需要從Erlang開始按順序對zip_file記錄進行適當的表示,以便能夠正確使用它。 否則,我們將不得不對元組進行匹配,其中包含許多元素,這些元素會不必要地混亂我們的代碼。 以下模塊主要基於Elixir的File.Stat實現,並允許我們使用簡單的點表示法訪問那些難以處理的元組中的值。

require Record

defmodule Zip.File do
  record = Record.extract(:zip_file, from_lib: "stdlib/include/zip.hrl")
  keys   = :lists.map(&elem(&1, 0), record)
  vals   = :lists.map(&{&1, [], nil}, keys)
  pairs  = :lists.zip(keys, vals)

  defstruct keys

  def to_record(%Zip.File{unquote_splicing(pairs)}) do
    {:zip_file, unquote_splicing(vals)}
  end

  def from_record(zip_file)
  def from_record({:zip_file, unquote_splicing(vals)}) do
    %Zip.File{unquote_splicing(pairs)}
    |> Map.update!(:info, fn(info) -> File.Stat.from_record(info) end)
  end
end

我們現在可以圍繞Erlang zip模塊構建一個小包裝類。 它沒有包裝所有方法,只包括我們將在這里使用的方法。 我還添加了一個list_files/1函數,它只返回文件,不包括列表中的目錄和注釋。

defmodule Zip do
  def open(archive) do
    {:ok, zip_handle} = :zip.zip_open(archive)
    zip_handle
  end

  def close(zip_handle) do
    :zip.zip_close(zip_handle)
  end

  def list_dir(zip_handle) do
    {:ok, result} = :zip.zip_list_dir(zip_handle)
    result
  end

  def list_files(zip_handle) do
    list_dir(zip_handle)
    |> Enum.drop(1)
    |> Enum.map(&Zip.File.from_record/1)
    |> Enum.filter(&(&1.info.type == :regular))
  end
end

假設我們有以下zip存檔進行測試:

cd /tmp
touch foo bar baz
zip archive.zip foo bar baz

現在您可以在zip存檔中聲明文件名:

test "files are in zip" do
  zip = Zip.open('/tmp/archive.zip')
  files = Zip.list_files(zip) |> Enum.map(&(&1.name))
  Zip.close(zip)
  assert files == ['foo', 'bar', 'baz']
end

我將在zip存檔上留下進一步的操作和斷言供您實現,並希望這可以幫助您入門。

您表明您要驗證zip文件及其內容。 雖然這部分是Elixir / Erlang問題,但它也有點超出了這個簡單的背景。 這是我的建議:

  1. 創建所有文件的列表,並為每個文件創建校驗和。 把它保存在某個地方。

  2. 拉鏈整個東西。

  3. 將zip中的文件解壓縮到其他目錄。

  4. 計算解壓縮目錄中的文件 - 如果文件數不相同,則測試失敗。

  5. 檢查根據步驟1中創建的列表提取的文件列表。如果文件列表不匹配,則測試失敗。

  6. 計算所有文件的校驗和。 將校驗和與步驟1中存儲的校驗和進行比較。如果它們不匹配,則測試失敗。

總而言之,這對我來說是一個非常毫無意義的練習,因為基本上你正在測試的是Erlang zip庫。 如果Erlang zip庫中存在缺陷,那么人們就已經抱怨了很長時間,而且你只需谷歌搜索它就能發現存在缺陷。

也就是說,雖然你可以為此編寫單元測試,但這對我來說是浪費時間。

暫無
暫無

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

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