运行 测试前的终端命令 - Elixir

Run terminal command before tests - Elixir

我正在测试与 fakeS3 的 S3 连接,它运行良好。唯一的缺点是每次 运行 我的测试之前我都必须 运行 伪造的 S3 服务器,否则 S3 测试将明显中断。

我想在测试前想出一个方法 运行 这个命令 运行:

fakes3 -r ~/.s3bucket -p 4567

理论上这将启动 Sinatra 服务器,以便 S3 测试通过,但我不需要每次都启动单独的服务器。

我已经试过了,但没有成功是有原因的:

MIX.exs

 test: ["ecto.create --quiet", "ecto.migrate", "fakes3 -r ~/.s3bucket -p 4567", "test"]

这不起作用,因为它不是混合任务。

我也可能以错误的方式思考这个问题。我怎样才能在测试前使用命令 运行?这是思考这个问题的正确方法吗?

只需使用 ExUnit.Callbacks.setup_all/1:

def fakes3(_context) do
  System.cmd("fakes3", ~w|-r ~/.s3bucket -p 4567|)
  :ok
end

setup_all :fakes3

以上是你用来测试S3的案例。


顺便说一句,这也可以用 mix 来完成。它有 run 任务,接受脚本到 运行 或表达式 eval 作为参数:

test: [ 
  "ecto.create --quiet",
  "ecto.migrate",
  ~S[run -e "System.cmd(~s|fakes3|, ~w|-r ~/.s3bucket -p 4567|)"],
  "test"
]