如何配置 test_pattern 进行混合测试

How to configure test_pattern for mix test

我想将 test_pattern 更改为 mix test,但我无法找到执行此配置的正确方法。我在 config/test.exs 中尝试了多种配置变体,但从未弄清楚。最终我发现更改 mix.exs (我认为这是最高级别的配置文件)有效:

defmodule Server.Mixfile do
  use Mix.Project

  def project do
    [
      app: :server,
      version: "0.0.1",
      elixir: "~> 1.4",
      elixirc_paths: elixirc_paths(Mix.env),
      compilers: [:phoenix, :gettext] ++ Mix.compilers,
      start_permanent: Mix.env == :prod,
      aliases: aliases(),
      deps: deps(),
      test_pattern: "*_test.ex", # ----- this is what worked!
    ]
  end

  # more config stuff
end

mix test 执行配置的正确方法是什么?

我通过查看 this LOC 并尝试让我的项目配置符合该检查,从而遇到了这个 hack。我怀疑有更好的方法来实现我想要的。

这是我的 config/test.exs 文件现在的样子(有一些评论)

use Mix.Config

# We don't run a server during test. If one is required,
# you can enable the server option below.
config :server,
       ServerWeb.Endpoint,
       http: [
         port: 4001
       ],
       server: false

# Print only warnings and errors during test
config :logger, level: :warn

config :server,
       Server.Repo,
       adapter: Ecto.Adapters.Postgres,
       username: System.get_env("POSTGRES_USER") || "postgres",
       password: System.get_env("POSTGRES_PASSWORD") || "postgres",
       database: System.get_env("POSTGRES_DB") || "postgres",
       hostname: System.get_env("POSTGRES_HOST") || "localhost",
       pool: Ecto.Adapters.SQL.Sandbox
       # test_pattern: "*_test.ex" ---- this doesn't get picked up

#config :project, ------------- this complains about the application "project" not being available
#       test_pattern: "*_test.exs?"

为什么您认为 config :server 中的任何更改都会导致 side-effects? Mix.Config.config/3 是一个简单的宏,它将值存储在配置存储中以供将来使用。它不执行任何代码,也没有任何 side-effects.

更重要的是,您尝试放置 test_pattern 键的部分是 Server.Repo,它由 Ecto.Repo 读取,而后者对如何处理 test_pattern 键并有效地忽略它。

作为旁注,我想说改变测试模式以包含已编译的 *.ex 文件通常听起来不是一个好主意;默认情况下,这些文件将被 1) 编译和 2) 包含在发布中。他们有意 *.exs 扩展名:尾随的“s”代表“脚本”,前提是文件将被视为脚本。

另外,如果你仍然确定你想要这个模式,通过 project 配置来配置它正是它所属的地方。这绝不是黑客攻击,这是改变模式的预期方式。