Я пишу тест для проверки функции (автоматически вызываемой GenServer, когда новый файл попадает в папку), которая вызывает другие функции в том же модуле с каналами для чтения файла, обработки его содержимого, чтобы вставить его, если необходимо, и возврата список (: ошибки и: ok карты).
результаты выглядят так:
[
error: "Data not found",
ok: %MyModule{
field1: field1data,
field2: field2data
},
ok: %MyModule{
field1: field1data,
field2: field2data
},
error: "Data not found"
код :
def processFile(file) do
insertResultsMap =
File.read!(file)
|> getLines()
|> extractMainData()
|> Enum.map(fn(x) -> insertLines(x) end)
|> Enum.group_by(fn x -> elem(x, 0) end)
handleErrors(Map.get(insertResultsMap, :error))
updateAnotherTableWithLines(Map.get(insertResultsMap, :ok))
end
defp getLines(docContent) do
String.split(docContent, "\n")
end
defp extractMainData(docLines) do
Enum.map(fn(x) -> String.split(x, ",") end)
end
defp insertLines([field1, field2, field3, field4]) do
Attrs = %{
field1: String.trim(field1),
field2: String.trim(field2),
field3: String.trim(field3),
field4: String.trim(field4)
}
mymodule.create_stuff(Attrs)
end
defp handleErrors(errors) do
{:ok, file} = File.open(@errorsFile, [:append])
saveErrors(file, errors)
File.close(file)
end
defp saveErrors(_, []), do: :ok
defp saveErrors(file, [{:error, changeset}|rest]) do
changes = for {key, value} <- changeset.changes do
"#{key} #{value}"
end
errors = for {key, {message, _}} <- changeset.errors do
"#{key} #{message}"
end
errorData = "data: #{Enum.join(changes, ", ")} \nErrors: #{Enum.join(errors, ", ")}\n\n"
IO.binwrite(file, errorData)
saveErrors(file, rest)
end
defp updateAnotherTableWithLines(insertedLines) do
Enum.map(insertedLines, fn {:ok, x} -> updateOtherTable(x) end)
end
defp updateOtherTable(dataForUpdate) do
"CLOSE" -> otherModule.doStuff(dataForUpdate.field1, dataForUpdate.field2)
end
У меня есть несколько вопросов, некоторые из них будут довольно простыми, поскольку я все еще учусь:
- Что вы думаете о коде? Какие-нибудь советы? (учтите, что я добровольно запутал имена).
- Если я хочу это проверить, правильно ли это проверять только
processFile
функцию? Или я должен сделать больше из них и протестировать их индивидуально? - Когда я тестирую функцию
processFile
, я проверяю, что получаю список. Есть ли способ убедиться, что в этом списке есть только элементы, которых я жду, напримерerror: "String"
илиok: %{}
"?