Как скрыть логи в одних тестах, а не в других? - PullRequest
0 голосов
/ 15 января 2019

Фон

У меня есть библиотека, которая регистрирует сообщения в зависимости от значения disable_logging:

unless Application.get(:my_app, :disable_logging, false), do:
  Logger.info("Hello World!")

В зависимости от MIX_ENV У меня есть конфигурация для каждой настройки:

#test.config
use Mix.Config
config :my_app, disable_logging: true

Проблема

Проблема здесь в том, что я не хочу, чтобы во всех моих результатах теста появлялись сообщения журнала.Поэтому, естественно, я мог установить disable_logging в true и покончить с этим.

Однако, если я это сделаю, я не смогу проверить, вызывается ли Logger и правильно ли он вызывается:

Вопрос

Итак, учитывая это, у меня есть несколько вопросов:

  1. Есть ли способ активировать журналы, но без вывода их на терминал во время работы?тесты?
  2. Есть ли способ активировать журналы только для некоторых тестов в моем наборе тестов?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Почему бы не использовать ExUnit.CaptureLog для подавления журналов и просто отбросить результат?


Если у вас есть большое количество тестов, которые регистрируются на консоли, и вы не хотите делать это для всех из них, вы можете создать пользовательский ExUnit tag в сочетании с ответом @ Aleksei, который сделает это за вас.

Добавьте в свой шаблон ExUnit.Case:

setup tags do
  if tags[:disable_logger] do
    Application.put_env(:my_app, :disable_logging, false)

    on_exit(fn ->
      Application.put_env(:my_app, :disable_logging, true)
    end)
  end

  :ok
end

Теперь вы можете просто указать тег для тестов, для которых вы хотите отключить ведение журнала:

@tag disable_logger: true
test "something happens" do
  # ...
end

Примечание: С этим вы столкнетесь с проблемами при асинхронном запуске тестов

0 голосов
/ 15 января 2019

Объявите ExUnit.setup/1 с обязательным ExUnit.on_exit/2 для установки переменной среды с Application.put_env/4.

setup do
  Application.put_env(:my_app, :disable_logging, false)

  on_exit fn ->
    Application.put_env(:my_app, :disable_logging, true)
  end

  :ok
end

Я не проверял, но это должно работать.

...