- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 C# 公共(public) API,许多第三方开发人员都在使用它,这些开发人员在其上编写了自定义应用程序。此外,该 API 被内部开发人员广泛使用。
这个 API 的编写并没有考虑到可测试性:大多数类方法不是虚拟的,并且东西没有被分解到接口(interface)中。此外,还有一些辅助静态方法。
出于多种原因,我无法在不对使用我的 API 的程序员开发的应用程序造成重大更改的情况下对设计进行重大更改。但是,我仍然希望让使用此 API 的内部和外部开发人员有机会编写单元测试并能够模拟 API 中的对象。
有几种方法浮现在脑海中,但它们似乎都不是很好:
public class UserRepository
{
public UserData GetData(string userName)
{
...
}
}
最佳答案
您真正要问的是,“我如何根据 SOLID 和类似原则设计我的 API,以便我的 API 与其他人一起玩得很好?”这不仅仅是关于可测试性。如果你的客户在用你的代码测试他们的代码时遇到问题,那么他们在用你的代码编写/使用他们的代码时也会遇到问题,所以这是一个比可测试性更大的问题。
简单地提取接口(interface)并不能解决问题,因为很可能您现有的类接口(interface)(具体类作为其方法/属性公开的内容)在设计时并没有考虑到接口(interface)隔离原则,因此提取的接口(interface)会出现各种问题(一些您在对先前答案的评论中提到了其中的内容)。
我喜欢称其为 IHttpContext 问题。如您所知,由于 HttpContext.Current 的“魔术单例依赖”问题,ASP.NET 很难测试或使用它。没有像 TypeMock 使用的花哨的技巧,HttpContext 是不可模拟的。简单地提取 HttpContext 的接口(interface)不会有太大帮助,因为它太大了。最终,即使是 IHttpContext 也会成为测试的负担,以至于它几乎不值得尝试模拟 HttpContext 本身。
确定对象职责,适本地划分接口(interface)和交互,并以开放/封闭原则进行设计,这不是您试图强行/塞进现有 API 设计而没有考虑这些原则的事情。
我不想给你一个如此冷酷的答案,所以我会给你一个积极的建议:你如何代表你的客户承担所有的悲伤,并在你的旧 API 之上制作某种服务/外观层。这个服务层将不得不处理 API 的细节和痛苦,但会提供一个漂亮、干净、对 SOLID 友好的公共(public) API,您的客户可以使用它而减少摩擦。
这还有一个额外的好处,即允许您慢慢替换 API 的一部分,并最终使您的新 API 不仅仅是外观,而是 API(并且旧 API 已被淘汰)。
关于c# - 如何使现有的公共(public) API 可供使用它的外部程序员测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/387451/
在 PHP 中,开始破解并弄清楚页面上发生的事情非常容易。只需输入一堆回声和 print_r,仅此而已。看来这种技术在 python 中对我不起作用。我通过在 python 照片上传模块中进行黑客攻击
程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享) 应届生面试经验参考:https://www.cnblogs.com/rainbow-1/p/16779048.html 简历: 1、
上图的意思: 百战百胜,屡试不爽. 故事 程序员小张: 刚毕业,参加工作1年左右,日常工作是CRUD 。 架构师老李: 多个大型项目经验,精通各种开发架构屠龙宝术;
周末了开心一下 谈到程序员,对于外行人来说一贯的印象就是格子衫大裤衩外加人字拖,蓬头(秃头)垢面黑眼圈,还有就是“人傻钱多死得快”🤣,这是外界对程序员固有的思想,但是作为新世纪的程序员,我们可没那么
我从事C++编程已有5年了,现在我意识到知道如何“不同地”思考的值(value)。 这个问题适用于尝试其他编程语言并遇到过类似情况的C++程序员: “哇,这太酷了!我不知道我可以那样编程。” “哇,我
互联网已经渗入我们生活的方方面面,于是我们就免不了会思考:如果有一天网络断了怎么办呢? 英国 Cable.co.uk 曾进行了一项有趣的"断网"调查,调查发现在 2500
这些是 “程序员可见” x86-64 寄存器: (来源:usenix.org) 隐形寄存器呢?刚刚才知道MMU寄存器,Interrupt Descriptor Table(IDT)使用了这些不可见的寄
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
有没有办法将 Dragon NaturallySpeaking 合并到事件驱动程序中?如果我使用 DNS 记录用户语音输入而不将其写入屏幕并直接保存为 XML,我的老板会非常喜欢它。我已经研究了好几天
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
这个问题在这里已经有了答案: 关闭12年前。 Possible Duplicate: Should I learn C before learning C++? 作为一名专业 (Java) 程序员和重
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在将一个使用串行端口的 C++ 程序(更准确地说是 Borland“组件”)“转换”为 Java。该程序使用一个线程来监听串行端口,并在收到给定的“事件字符”之一(可能是回车、ACK、NACK .
我是克里斯。我对编码很陌生,我不知道很多术语,这是我第三次也是最成功的学习 Java 的尝试。是的,如果我还年轻,效果就不太好。无论如何,我正在尝试创建游戏,但遇到了一个小问题。 我制作了一个 16
我是一名优秀的程序员,十分优秀!