在 Phoenix 测试中避免第三方 API 调用
在 Phoenix 测试中避免第三方 API 调用
原文:https://medium.com/hackernoon/controlled-testing-in-phoenix-50709cb5c9c5
最近在做一个 Phoenix 项目时,我发现我想在运行我的测试时避免调用第三方 API。使用 Twilio ,通过 ExTwilio 库,我给用户发送短信。发送每条短信都要花钱,我的测试是生成随机的电话号码和信息,所以你可以明白我为什么需要这么做。我用这个方法进行第三方 API 调用:
为了避免库调用,我在插件中做了一些挖掘。Conn 文档并看到当运行测试时,Conn 的适配器字段是‘Plug’。“适配器.测试.连接”。知道了这一点,我认为模式匹配是在测试期间避免 API 调用的简单方法,我只需将 conn 传递给我的方法,然后像这样编辑它:
如果运行测试,将调用第一个实现,因为它将首先匹配,否则将调用真正的实现。有了它,我可以很容易地避免我的 API 调用,这对我来说并不坏,因为它只发生在我代码中的一个地方。
然而,我在函数中传递了一个参数,而没有真正在函数内部做任何事情,所以如果我不得不在多个地方这样做,它可能会变得很脏。此外,它依赖于 conn,所以如果我必须在 web 请求未被处理时调用此方法,就会出现问题。为了解决这个问题,还有另一种方法,它使用项目的配置设置,并在测试期间调用一个假模块。
比方说,我正在运行相同的短信发送代码,除了它是在后台完成的,我们没有连接,我拉一个电话号码列表,每个小时给每个人发一条短信。让我们像这样定义一个模块 Twilio.ex 来处理 API 调用:
同时,我会定义一个假的模块来模拟测试用例中使用的真实模块,FakeTwilio.ex:
现在,通过在我们的 config.exs 和 test.exs 文件中设置定义,我可以很容易地根据我是否正在运行测试来使用正确的模块:
这将设置它,以便通过“Application.get_env”调用检索正确的模块,只需将模块包装在一个帮助器函数中,该函数将获得正确的配置设置,如下所示:
这里,私有的 text_module 方法将在测试期间自动加载假模块,否则加载真模块。
这两种方法都允许我在运行测试时避免调用第三方 API,这里有一个使用这两种设置的示例项目:https://github.com/chiragtoor/test_controlled_apis



