模拟开发中的第三方图书馆



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

所以在注册期间,我想给用户发一封电子邮件。在开发过程中,我希望电子邮件模块使用不同的模拟模块,即只输出日志跟踪,而不是真正发送电子邮件。

长生不老药有什么选择?这是我可以在phoenix中的配置中交换实现的吗?

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

答案是:依赖项注入


JoséValim的这篇优秀文章是必读的;如果可以的话,我会引用所有的(下面的重点是我的。(

我稍后会强调这一点,但我总是认为"mock"是名词,而不是动词

当要通过测试时,一种常见的做法是继续模拟(警告!模拟为动词!(底层的[…]


此外,Lasse Ebert的这篇文章值得一读。

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

但是,如果您更喜欢进行依赖项注入,则可以使用配置来指向依赖项。我从未在生产中以这种方式使用过配置,这可能是一种糟糕的做法,但这就是我处理问题的方式。

下面是一个关于Enum.map/2&CCD_ 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

当您在prod中获得:mapper(使用与dev中相同的代码(时,您将获得Stream模块:

iex> Application.get_env(:sandbox, :mapper)
Stream
iex> Application.get_env(:sandbox, :mapper).map(0..2, &Integer.to_string/1)
#Stream<[enum: 0..2, funs: [#Function<48.15162342/1 in Stream.map/2>]]>

以这种方式进行依赖项注入与将其传递到每个函数调用中有一个权衡:粒度。您不必在任何地方都传递它,但您也会被编译时设置的任何内容所困扰。

最新更新