模拟开发中的第三方库

时间:2018-12-14 03:53:26

标签: elixir phoenix-framework

模拟第3方库的灵丹妙药是什么。

因此,在注册过程中,我想向用户发送电子邮件。在开发中,我希望电子邮件模块使用另一个模拟模块,该模块将仅输出日志跟踪而不是实际发送电子邮件。

长生不老药中对此有哪些选择? 我可以在phoenix的配置中做一些事情来交换实现吗?

2 个答案:

答案 0 :(得分:1)

  

模拟第三方库的灵丹妙药是什么?

答案是:依赖注入


何塞·瓦里姆(JoséValim)的《 excellent article》必读;如果可以的话,我会全部引用(下面的重点是我的。)

  

稍后我会强调这一点,但我始终认为“模拟”是一个名词,而不是一个动词

  

要使测试通过,通常的做法是继续模拟(警告!模拟为动词!)作为基础[...]


此外,Lasse Ebert的article值得一读。

答案 1 :(得分:0)

以我的个人经验,有时会有我的开发环境命中的开发实例/工作区/等是很好的。通常,点击dev实例和prod实例之间的唯一区别是调用API所使用的凭据/ URL,这使我的prod / dev代码完全相同。

但是,如果您希望进行依赖注入,则可以使用config指向依赖项。我从未在生产中以这种方式使用config,这可能是不好的做法,但这就是我要解决的问题的方式。

以下是一个围绕Cmd cmd; cmd.set_code(1); CmdOne cmd_one; *(cmd_one.mutable_cmd()) = cmd; Enum.map/2的示例。假设您的开发配置如下:

Stream.map/2

当您要求# config/dev.exs config :sandbox, mapper: Enum 时,您将获得:mapper模块并可以直接调用它:

Enum

但是,您的产品配置看起来像这样:

iex> Application.get_env(:sandbox, :mapper)
Enum
iex> Application.get_env(:sandbox, :mapper).map(0..2, &Integer.to_string/1)
["0", "1", "2"]

当您在产品中获得# config/prod.exs config :sandbox, mapper: Stream (使用与dev中相同的代码)时,您将获得:mapper模块:

Stream

在进行依赖项注入时要进行权衡,而不是将其传递给每个函数调用:粒度。您不必在任何地方都传递它,但是您在编译时所设置的任何内容都将被卡住。