Как избежать ошибки ExUnit.start () при запуске смешанного теста - PullRequest
2 голосов
/ 17 февраля 2020

Когда я запускаю mix test в моем проекте, я получаю следующую ошибку, и я не понимаю, почему:

$ mix test
Compiling 2 files (.ex)

== Compilation error in file lib/myproject_web/controllers/email_controller_test.ex ==
** (RuntimeError) cannot use ExUnit.Case without starting the ExUnit application, please call ExUnit.start() or explicitly start the :ex_unit app
    expanding macro: ExUnit.Case.__using__/1
    lib/myproject_web/controllers/email_controller_test.ex:2: MyProjectWeb.EmailControllerTest (module)
    (elixir 1.10.1) expanding macro: Kernel.use/2
    lib/myproject_web/controllers/email_controller_test.ex:2: MyProjectWeb.EmailControllerTest (module)

У меня уже есть test_helper.exs файл в lib/, который вызывает ExUnit.start(). Моя установка необычна, потому что я хочу, чтобы тесты располагались рядом с модулями, а не в отдельной папке test.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Оказывается, эта ошибка происходит из-за тестового файла с расширением .ex, а не .exs. С .ex тогда mix пытается скомпилировать его со всем остальным перед запуском тестов, а затем жалуется, потому что ExUnit.start() не был вызван во время компиляции.

С расширением .exs затем файл не компилируется, но запускается mix test после вызова ExUnit.start() из test_helpers.exs.

0 голосов
/ 17 февраля 2020

Если вы прочитали документацию mix test:

Эта задача запускает текущее приложение, загружает test/test_helper.exs, а затем требует все файлы, соответствующие test/**/*_test.exs шаблон параллельно.

Вы были правы, что .exs файлы не скомпилированы, однако это не проблема, если они даже были скомпилированы. Тесты выполняются как сценарии, чтобы избежать многократной компиляции, так как они каждый раз получают случайный порядок с разной выходной компиляцией.

Задача сначала компилирует все файлы, затем запускает ExUnit и расширяет все макросы из *_test.exs скриптов. Чтобы доказать это, взгляните на этот фрагмент кода :

defmacro __using__(opts) do
    unless Process.whereis(ExUnit.Server) do
      raise "cannot use ExUnit.Case without starting the ExUnit application, " <>
              "please call ExUnit.start() or explicitly start the :ex_unit app"
    end

Это означает, что в файлах, где вы используете use ExUnit.Case, сервер ExUnit должен быть запущен и работать на момент, когда эти сценарии интерпретируются.

В общем, в вашем случае, даже после изменения на .exs ваши тесты не должны были работать, поскольку при конфигурации по умолчанию путь к тестам :

 defp default_test_paths do
    if File.dir?("test") do
      ["test"]
    else
      []
    end

Вместо этого вы должны были вызвать тесты с:

mix test test/some/particular/file_test.exs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...