ExUnit без утверждения/опровержения, полагаясь исключительно на сопоставление с образцом?

Я тестирую возвращаемое значение функции. Какой из двух способов предпочтительнее?

test "extra verbose, using assert" do
  {:error, reason} = MyModule.my_fun
  assert reason == :nope
end

test "using pattern matching only" do
  {:error, :nope} = MyModule.my_fun
end

Мне нравится первый, потому что сейчас я его не люблю, тесту нужен оператор assert, а сообщение об ошибке при запуске теста более описательное. Ото, MatchError с номером строки тоже должно быть достаточно.


person Carsten    schedule 12.04.2017    source источник


Ответы (1)


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

assert {:error, :nope} = MyModule.my_fun

В отличие от ==, вы можете использовать любой шаблон в левой части, хотя в этом случае = можно заменить на ==, так как левая часть является допустимым шаблоном и значением.

В случае неудачи вы получите сообщение об ошибке, которое лучше, чем простое сопоставление с шаблоном без assert, например.

  1) test the truth (MTest)
     test/m_test.exs:10
     match (=) failed
     code:  {:error, :nope} = MyModule.my_fun()
     right: {:error, :nop}
     stacktrace:
       test/m_test.exs:11: (test)
person Dogbert    schedule 12.04.2017
comment
Для меня главный недостаток использования assert для совпадения заключается в том, что вы не получите сравнения левого и правого в результатах теста. - person Stuart; 12.04.2017
comment
assert {:error, :nope} = MyModule.my_fun действительно что-то тестирует? Если шаблон совпадает, он в основном утверждает, что кортеж {:error, :nope} правдив, не так ли? Если шаблон не совпадает, остается MatchError. - person Carsten; 12.04.2017
comment
@carp нет, MatchError не будет. assert специально обрабатывает =. Я только что добавил пример вывода об ошибке теста в ответ. - person Dogbert; 12.04.2017
comment
@Stuart Да, если LHS является допустимым значением, я бы использовал ==, чтобы получить этот красивый цветной diff, но если это неверное значение, это лучше, чем просто pattern = value в тесте. - person Dogbert; 12.04.2017
comment
@Dogbert очень верно, я думаю, что при утверждении результатов атома == на самом деле не нужно. Суть в том, что всегда используйте утверждение :) - person Stuart; 12.04.2017