查看源代码 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
消息。
将消息转发到当前进程。
如果当前应用程序还没有打印,则打印它。
将消息转发到当前进程。
将消息转发到当前进程。
函数
执行给定的命令并将它的消息转发到当前进程。
将错误转发到当前进程。
从当前进程中刷新所有 :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?")
将消息转发到当前进程。
它还会检查收件箱中是否有匹配的输入消息
{:mix_shell_input, :yes?, value}
如果不存在,它将中止,因为没有提供 shell 进程输入。 value
必须是 true
或 false
。
示例
# 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?")