查看源代码 Mix.Shell.Process (Mix v1.16.2)

使用当前进程邮箱进行通信的 Mix shell。

此模块提供了一个 Mix shell 实现,它使用当前进程邮箱进行通信,而不是使用 IO。

例如,当调用 Mix.shell().info("hello") 时,以下消息将被发送到调用进程

{:mix_shell, :info, ["hello"]}

这在测试中非常有用,它允许我们断言是否收到了给定的消息,而不是对一些捕获的 IO 进行检查。还存在一个 flush/1 函数,它负责从进程收件箱中刷新所有与 :mix_shell 相关的消息。

示例

第一步是将 Mix shell 设置为此模块

Mix.shell(Mix.Shell.Process)

然后,如果您的 Mix 任务调用

Mix.shell().info("hello")

只要它们在同一个进程中运行,您应该能够在您的测试中收到它

assert_receive {:mix_shell, :info, [msg]}
assert msg == "hello"

您也可以在测试中响应提示

send(self(), {:mix_shell_input, :prompt, "Pretty cool"})
Mix.shell().prompt("How cool was that?!")
#=> "Pretty cool"

概要

函数

执行给定的命令并将它的消息转发到当前进程。

将错误转发到当前进程。

从当前进程中刷新所有 :mix_shell:mix_shell_input 消息。

将消息转发到当前进程。

如果当前应用程序还没有打印,则打印它。

将消息转发到当前进程。

将消息转发到当前进程。

函数

执行给定的命令并将它的消息转发到当前进程。

将错误转发到当前进程。

指向此函数的链接

flush(callback \\ fn x -> x end)

查看源代码

从当前进程中刷新所有 :mix_shell:mix_shell_input 消息。

如果提供了回调,则会为每个接收到的消息调用它。

示例

flush(&IO.inspect/1)

将消息转发到当前进程。

将消息转发到当前进程。

它还会检查收件箱中是否有匹配的输入消息

{:mix_shell_input, :prompt, value}

如果不存在,它将中止,因为没有提供 shell 进程输入。 value 必须是字符串。

示例

以下将使用 "Meg" 回答提示 "What's your name?"

# The response is sent before calling prompt/1 so that prompt/1 can read it
send(self(), {:mix_shell_input, :prompt, "Meg"})
Mix.shell().prompt("What's your name?")
指向此函数的链接

yes?(message, options \\ [])

查看源代码

将消息转发到当前进程。

它还会检查收件箱中是否有匹配的输入消息

{:mix_shell_input, :yes?, value}

如果不存在,它将中止,因为没有提供 shell 进程输入。 value 必须是 truefalse

示例

# Send the response to self() first so that yes?/2 will be able to read it
send(self(), {:mix_shell_input, :yes?, true})
Mix.shell().yes?("Are you sure you want to continue?")