[英]What is the best way to assert the contents of a zip archive in Elixir?
目前我在做什么:
: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問題,但它也有點超出了這個簡單的背景。 這是我的建議:
創建所有文件的列表,並為每個文件創建校驗和。 把它保存在某個地方。
拉鏈整個東西。
將zip中的文件解壓縮到其他目錄。
計算解壓縮目錄中的文件 - 如果文件數不相同,則測試失敗。
檢查根據步驟1中創建的列表提取的文件列表。如果文件列表不匹配,則測試失敗。
計算所有文件的校驗和。 將校驗和與步驟1中存儲的校驗和進行比較。如果它們不匹配,則測試失敗。
總而言之,這對我來說是一個非常毫無意義的練習,因為基本上你正在測試的是Erlang zip庫。 如果Erlang zip庫中存在缺陷,那么人們就已經抱怨了很長時間,而且你只需谷歌搜索它就能發現存在缺陷。
也就是說,雖然你可以為此編寫單元測試,但這對我來說是浪費時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.