Unestable Braintree API:我应该修改源代码还是单独包装每个类
本文关键字:单独 包装 源代码 API Braintree 我应该 修改 Unestable | 更新日期: 2023-09-27 18:22:50
我正在使用Braintree API for.NET来处理付款。他们的业务在处理支付方面做得很好,API包装器可以直接使用。然而,所提供的API包装器在更仔细的调查或更剧烈的使用后开始迅速失效;例如,它包含手动滚动的enum
s。我的问题来自于对使用此包装器的代码进行单元测试。
为了做到这一点,我基本上需要模拟我自己的"假"Braintree网关,该网关中会有一些已知值,在请求时生成错误等。我的攻击计划是覆盖Braintree API包装器的功能,并将请求重新路由到本地内存端点。然后,我可以在运行时使用依赖注入来连接正确的网关/包装器。
起初,它似乎进展顺利:尽管API包装器中犯下了违反软件工程的罪,但我需要覆盖的每个方法都奇迹般地标记为virtual
。然而,这就急刹车了:API包装器中的几乎构造函数都标记为internal
。因此,我既不能继承这些类,也不能随心所欲地创建它们来存储以进行测试。
题外话:我发现了internal
构造函数,以及人们合法地想要使用它们的原因。然而,我已经查看了这方面的源代码,并且每个internal
构造函数只执行琐碎的属性赋值。因此,我很乐意声称应该遵循不同的编码实践
因此,我基本上只剩下三个选项:
-
从头开始编写我自己的API包装程序。这显然是可行的,并且具有这样的优势,即它将产生一个精心设计的基础设施。然而,缺点太多,无法简单列出。
-
从API中提取源代码,并将其包含在我的解决方案中。我可以将所有的
internal
构造函数更改为使它们工作所需的任何构造函数。缺点是,我将不得不在后续的每个API包装发布时重新更新所有这些更改。 -
为我需要在整个API包装器中使用的每个对象编写包装器类。这具有不改变所提供的源代码的优点;然而,缺点是很大的:基本上重写包装器中的每个类三次(一个接口、一个Braintree API包装器适配器和一个可测试的版本)。
不幸的是,所有这些都很糟糕。我觉得选项2可能是所有选项中最不糟糕的,但它让我感到肮脏。有没有人已经解决了这个问题/编写了一个更好、更可测试的包装器?如果没有,我是否错过了可能的行动方案?如果没有,这三种选择中哪一种似乎最不令人反感?
也许这个stackoverflow条目可以帮助
此外,关于主题的随机博客条目
由于您没有测试他们的API,因此我将使用Facade模式。您不需要包装它们提供的所有,只需封装您正在使用的功能即可。这也给了你一个优势:如果你决定在未来放弃API,你只需要重新实现你的包装器。