我正在尝试编写一个确保文本文件中包含内容的测试,但该测试仍会失败,我不确定是什么问题?

时间:2019-05-07 22:01:06

标签: testing elixir

因此,我正在尝试在Elixir项目中编写一个测试,以确保txt文件中包含内容。但是,每次我尝试在代码中用不同的词组表示测试时,或者当我更改函数时,它总是失败。我很困惑,该怎么办?

我尝试使用Enum.count/1函数,但是编译器告诉我我的函数不好。然后,我尝试向Enum.count/1函数添加一个assert命令,以为也许我需要添加它,但是编译器说assert_Enum不存在。

def read_memberlist do
  load_from_file "test/memberemaillist.txt"
end

test "that there is one member email in memberlist.txt file" do
  ClientEmailCleaner.read_memberlist()
  |> Enum.count(1)
  |> assert_Enum.count
end

我希望当我写Enum.count时,它将计算文本文件中的内容。但是,它失败了,编译器说存在“错误的函数错误”。接下来,我尝试添加一个assert命令,但是编译器告诉我我编写的命令“ assert_Enum.count”不存在。

2 个答案:

答案 0 :(得分:1)

不确定为什么尝试使用Enum.count来测试txt文件中是否包含内容。如果您的txt文件为空File.read!将返回一个空字符串“”。也许您可以

的形式写一些惯用的Elixir
{:ok, content}, {:error, reason}

您的模块可以这样写。

defmodule ClientEmailCleaner do

  def read_memberlist do
    memberlist = File.read!("test/member_email_list.txt")
    read_memberlist(memberlist)
  end

  defp read_memberlist(memberlist) when memberlist == "" do
    {:error, "File is empty"}
  end

  defp read_memberlist(memberlist) do
    {:ok, memberlist}
  end

end

然后在您的测试文件中,您可以编写一个涵盖两种情况的测试。 txt文件是否包含内容都将通过。

  test "returns content or error from memberlist.txt" do
    case ClientEmailCleaner.read_memberlist do
      {:ok, content} ->
        assert content

      {:error, reason} ->
        assert reason
    end
  end

答案 1 :(得分:0)

assert_Enum.count对于编译器来说有点未知。另外,以下代码无效,因为您试图在Enum.count/1带有1的情况下有效地传递两个参数:

ClientEmailCleaner.read_memberlist()
|> Enum.count(1)

以上内容完全等同于Enum.count(ClientEmailCleaner.read_memberlist(), 1)

您可能需要的是:

assert 1 == Enum.count(ClientEmailCleaner.read_memberlist())