Эликсир: сообщения об ошибках тестирования

Используя ExUnit от Elixir для модульного тестирования, все, кажется, в восторге от сообщений об ошибках теста. Однако, если я тестирую что-то кроме ==, я не могу получить полезное сообщение об ошибке.

Например

assert String.contains(my_string, "expected string")

    Expected truthy, got false

Я предпочитаю писать свои тесты так, чтобы мои неудачи были более информативными, что позволяло мне быстро повторять обратную связь, которую они дают. Есть ли способ получить более информативный провал теста? например

Expected "an unexpected string" to contain "expected string"

person steel    schedule 20.08.2016    source источник
comment
Вы можете написать макрос assert_contains, который делает это, или передать пользовательское сообщение assert, которое будет напечатано в случае сбоя, но я не уверен, какое именно решение вы ищете.   -  person Dogbert    schedule 20.08.2016
comment
Все, что актив делает, это проверяет правдивость. Вы можете предоставить сообщение, но само по себе оно не будет анализировать то, что вы запускаете, что приводит к результату в соответствии с утверждением. Это уже встречалось раньше, например, groups.google. com/forum/m/#!topic/elixir-lang-core/KYAkagiKr0w, но это все еще не происходит автоматически, как вы просите.   -  person Dave Newton    schedule 20.08.2016


Ответы (1)


Для конкретного случая тестирования против String.contains? вы можете рассмотреть оператор сопоставления регулярных выражений =~, так как он сообщит о лучшем сообщении об ошибке теста из коробки.

Однако, как правило, assert ExUnit не знает о внутренней семантике каждой функции в стандартной библиотеке. Вот почему вы можете предоставить собственное сообщение об ошибке:

assert String.contains?(my_string, "expected string"),
       ~s(Expected #{inspect my_string} to contain "expected string")

Если у вас много утверждений для String.contains?/2, вы можете определить свое собственное утверждение:

def assert_contains(string, substring) do
  assert String.contains?(string, substring),
         "Expected #{inspect string} to contain #{inspect substring}"
end

test "my string" do
  assert_contains my_string, "expected string"
end

Вот выражения, которые assert и refute распознают и настроят вывод для Elixir 1.3:

  • = оператор сопоставления
  • match?/2 функция
  • ! отрицание
  • == оператор равенства
  • < меньше чем
  • > больше, чем
  • <= меньше или равно
  • >= больше или равно
  • === строгое равенство (различает числа с плавающей запятой и целые числа)
  • =~ оператор сопоставления регулярного выражения
  • !== строгое неравенство
  • != неравенство
  • in членство в перечислимом

Большинство из них имеют одинаковую специальную обработку: они являются инфиксными операторами, и assert будет сообщать о значениях lhs, rhs, которые он видит.

person Martin Svalin    schedule 20.08.2016