模拟第3方库的灵丹妙药是什么。
因此,在注册过程中,我想向用户发送电子邮件。在开发中,我希望电子邮件模块使用另一个模拟模块,该模块将仅输出日志跟踪而不是实际发送电子邮件。
长生不老药中对此有哪些选择? 我可以在phoenix的配置中做一些事情来交换实现吗?
答案 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
在进行依赖项注入时要进行权衡,而不是将其传递给每个函数调用:粒度。您不必在任何地方都传递它,但是您在编译时所设置的任何内容都将被卡住。