Я пытаюсь написать тест, который удостоверится, что в текстовом файле есть контент, но он продолжает терпеть неудачу, и я не уверен, в чем проблема? - PullRequest
0 голосов
/ 08 мая 2019

Итак, я пытаюсь написать тест в своем проекте Elixir, который будет проверять наличие содержимого в текстовом файле.Тем не менее, каждый раз, когда я пытаюсь сформулировать тест по-разному в коде, или когда я меняю функцию, она всегда терпит неудачу.Я очень запутался, что мне делать?

Я пытался использовать функцию Enum.count/1, но компилятор говорит мне, что у меня плохая функция.Затем я попытался добавить команду assert к функции Enum.count/1, подумав, что, возможно, мне нужно добавить это, но потом компилятор сказал, что 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 ]

1 голос
/ 08 мая 2019

Не уверен, почему вы пытаетесь использовать Enum.count для проверки наличия или отсутствия содержимого в текстовом файле. Если ваш текстовый файл пуст, File.read! вернет пустую строку "". Возможно, вы могли бы написать какой-нибудь идиоматический эликсир в виде

{: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

И тогда в вашем тестовом файле вы можете написать тест, который охватывает оба случая. Это пройдет, если текстовый файл содержит контент или нет.

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

      {:error, reason} ->
        assert reason
    end
  end
0 голосов
/ 08 мая 2019

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())
...