ExUnit.test/3
- это макрос , который определяет функцию для вас.
Каждый раз, когда вы определяете новую функцию в Elixir, она запускает новую область. Это означает, что любая переменная, определенная вне функции, не будет доступна внутри функции. Например, вы не можете сделать это:
foo = 1
def some_function() do
foo
end
Есть несколько способов, которыми вы можете обойти этот механизм. Одним из них является использование unquote
для ввода некоторых значений в качестве AST. Однако в этом случае самый простой подход - поместить значение в атрибут модуля, чтобы вы могли прочитать его внутри функции:
@foo 1
def some_function() do
@foo
end
Если вы хотите запустить один и тот же тест с разными входами (хотя это, вероятно, означает, что существуют проблемы с дизайном структуры теста), вы можете использовать ExUnit.Callbacks.setup_all/2
для настройки контекста теста или использовать атрибуты модуля как показано в документации для ExUnit.Case.test/3
Enum.each ~w(a b c), fn char ->
@char char
test "test involving #{char}", ctx do
assert @char == @char
end
end
Атрибуты модуля, очевидно, видны из любого места в модуле после их определения.