我维护一个用Ruby编写的Web API。它连接到许多第三方 Web 服务。在编写测试时,我会存根任何需要连接到网络的函数并返回瓶装数据。
以前发生在我身上,我忘记了这个存根步骤,我的集成测试最终实际上连接到了第三方服务。
考虑到这一点,我想阻止Ruby能够打开网络连接。尝试时,我希望它引发异常,指出我忘记存根的功能。
这可能吗?我需要覆盖哪个中央 Ruby 函数才能以最小的其他副作用来实现这一点?
WebMock呢?你试过吗?https://github.com/bblimke/webmock
这一行应该有帮助:
WebMock.disable_net_connect!(allow_localhost: true)
正如您刚才所说,手动存根是不可靠的。
更好的解决方案可能是将调用外部服务的代码包装在外观后面,并使用依赖项注入在创建时将 Web 处理服务传递到外观中。 然后,您的测试套件只需要对存根服务执行相同的操作。 您只需要执行此操作一次,然后测试外部代码的任何测试都将使用存根服务。
查看 VCR。
首先,看看它的文档,看看它是否是你需要的,我想是。几年来,我们一直在我的公司使用它来记录规范的一个HTTP测试,并为后续测试重播结果。
我们发现它在处理外部 API 时非常宝贵。