Модуль conncase не загружен и не может быть найден

Не могу понять эту ошибку.

У меня есть этот файл:

test/support/conn_case.ex

defmodule ProjectWeb.ConnCase do
  @moduledoc """
  This module defines the test case to be used by
  tests that require setting up a connection.

  Such tests rely on `Phoenix.ConnTest` and also
  import other functionality to make it easier
  to build common datastructures and query the data layer.

  Finally, if the test case interacts with the database,
  it cannot be async. For this reason, every test runs
  inside a transaction which is reset at the beginning
  of the test unless the test case is marked as async.
  """

  use ExUnit.CaseTemplate

  using do
    quote do
      # Import conveniences for testing with connections
      use Phoenix.ConnTest
      import ProjectWeb.Router.Helpers

      # The default endpoint for testing
      @endpoint ProjectWeb.Endpoint
    end
  end

end

А этот конфиг на mix.ex

  # Specifies which paths to compile per environment.
  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(_),     do: ["lib"]

Есть тест на test/controllers/page_controller_test.exs

defmodule ProjectWeb.PageControllerTest do
  use ProjectWeb.ConnCase

  test "GET /", %{conn: conn} do
    conn = get conn, "/"
    assert html_response(conn, 200) =~ "OK"
  end
end

Тем не менее при запуске mix test я получаю:

** (CompileError) test/controllers/page_controller_test.exs:2: module ProjectWeb.ConnCase is not loaded and could not be found

Вы когда-нибудь получали на это ответ?

Ruyonga Dan 12.04.2019 08:43

Это может быть полезно: github.com/phoenixframework/phoenix/issues/2405

Julian Espinel 11.05.2019 12:51
2
2
1 184
1

Ответы 1

Для всех, кто сталкивался с этим, возможно, у вас была та же проблема, что и у меня -> MIX_ENV по умолчанию установлен на dev. Если это так, вы можете легко проверить это, запустив MIX_ENV=test mix test, это установит среду для одного вызова. Если это сработает, у вас есть обходной путь и более постоянный, который я описал ниже.

Текущий способ, которым я это исправил, - это изменить mix.exs, чтобы он выглядел примерно так:

defmodule MyApp.MixProject do
use Mix.Project

  def project do
    [
      ...
      elixirc_paths: elixirc_paths(Mix.env()),
      ...
    ]
  end

  # Configuration for the OTP application.
  #
  # Type `mix help compile.app` for more information.
  def application do
    [
      mod: {MyApp.Application, []},
      extra_applications: [:logger, :runtime_tools]
    ]
  end

  # Specifies which paths to compile per environment.
  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(:dev), do: ["lib", "test/support"]
  defp elixirc_paths(_), do: ["lib"]

  # Specifies your project dependencies.
  #
  # Type `mix help deps` for examples and options.
  defp deps do
    [
      ...
    ]
  end
end

Важный бит, который здесь отличается от mix.exs по умолчанию, - это определение elixirrc_paths в блоке def project (это уже должно совпадать, но если нет, то должно) и добавление строки defp elixirc_paths(:dev), do: ["lib", "test/support"]

Возможно, это не совсем идиоматично, но при использовании среды dev mix это гарантирует, что ваши тесты также скомпилированы, и по-прежнему позволяет вам отдельно определять среду разработки и тестирования.

Обновлено: Идиоматично, кажется, практика заключается в том, чтобы вручную установить env, а не bork dev ENV, чтобы заставить его правильно запускать ваши тесты. Вам следует просто использовать MIX_ENV=test mix test для достижения своих целей, поскольку изменение среды разработки нежелательно в большинстве ситуаций.

Другие вопросы по теме