- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对单元测试真的很陌生,虽然我花了很多时间进行研究,但我无法找到适合我的案例的正确方法。
我的代码库很大(大约 3 年的工作),不幸的是耦合度很高,很难测试,而且从未对其进行过单元测试。
例如,当尝试测试集合类时 ProductCollection
,更具体地说,bool MoveElementAtIndex(Product productToMove, int newIndex)
其中,我遇到了以下问题:
new ProductCollection()
new KeyedList<ID, Product>
.我想这不应该在这个构造函数中调用,因为我没有测试 KeyedList
.ProductCollection
添加 3 个产品.new Product()
.Product
的构造函数类做几件事this.ID = IDUtils.ComputeNewIDBasedOnTheMoonPhase()
.我想我也不应该对此进行测试,因为这不是我的范围。我应该如何避免这种深度的调用?this.Properties = new ProductProperties(folderPathToDefaultProperties)
.这不应该从我的简单 FieldCollection.MoveElementAtIndex
调用测试,对吗?ProductCollection.Add(MyProduct)
检查底层的 KeyedList
是否已经包含该产品。这也是我应该避免的业务逻辑,与我的测试无关。问题是如何?Add
方法,会引发一些事件,通知系统几件事情(例如,新产品已添加到集合中)。我想这些也不应该被解雇。KeyedList
实际上包含那些字段,它调用KeyedList.Remove()
, KeyedList.Insert()
因为它的移动逻辑,它会触发类似 CollectionModified
的事件.如果你能解释一下如何正确地进行这个单元测试,如何避免底层对象被调用,我将不胜感激。
我想到了微软的 Moles 框架(VS2010),因为我的印象是它不需要我重构所有东西,因为这绝对不是一个选择。但是已经尝试过了,仍然找不到合适的使用方法。
此外,我的印象是这个具体示例对我的情况有帮助,因为现实世界中的代码通常就是这样。
有什么想法吗?
最佳答案
您的代码在设计时并未考虑单元测试,因此很难做到。我建议您正确设计新代码并对其进行单元测试,并尝试重构最重要的内容,以便对其进行单元测试。
例子:
But the constructor of Product class does several things. It computes a unique ID for the newly created product: this.ID = IDUtils.ComputeNewIDBasedOnTheMoonPhase(). I suppose I should not test this neither, since it's not my scope. How should I avoid such calls at this level of deepness?
要解决此问题,您应该将接口(interface) IUtils 传递给您的 Product 构造函数。要测试您的 Product 类,您可以创建一个 IUtils 的模拟,它返回一个设定值。您可以对 ProductProperties 执行相同的操作。
Also, in this Add method, some events are raised, notifying the system about several things (e.g., that a new product was added to the collection). These should also not be fired at all I suppose.
这归结为设计。您可以使用观察者模式,并且在单元测试时没有任何观察者。
关于c# - 单元测试 : how to test methods with a lot of underlying objects and business logic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294861/
目前我正在创建一个 C# 应用程序,它必须从现有数据库中读取大量数据(超过 2,000,000 条记录),并将其与数据库中不存在的大量其他数据(也大约 2,000,000 条记录)进行比较。这些比较主
我正在为需要将一些可变长度数组存储到 mysql 数据库中的系统设计数据库。 数组的长度(最多)为数百甚至数千。 新阵列将定期创建,可能每天数十个。 我应该将这些数组存储到一个很快就会变得巨大的表中还
问题:我有两个大型字符串元胞数组A 和B。我想知道识别 A 中哪些元素包含 B 中哪些元素的最快方法。特别是不循环能不能做到? 最小示例:(我的实际 A 和 B 分别包含 7,000,000 和 22
我有这些表: create table person ( person_id int unsigned auto_increment, person_key varchar(40) n
我正在处理一个简单的页面,但遇到固定位置的问题。想知道是否有人有时间帮助我。 在这里复制粘贴所有代码会太多,但我会粘贴一个链接 http://et4891.com/lecture/protosite.
我正在开发一个项目,需要能够将“很多”、“一些”、“很多”、“一些”等修饰符分类为最小百分比 例如“很多” -> 80% 现在我正在考虑简单地创建一个大字典来关联这些修饰符和数值,例如 一些 -> 1
我想将所有数据从工作表复制到另一个新 Excel 文件的另一工作表。我试过这个: Set wkb = Workbooks.Add wkb.SaveAs myNewFile ThisWorkbook.W
项目运行良好,运行良好,编译良好。直到一些看似随机的时间,它才停止变好。 目前,我遇到了200个流浪错误: ./new:4: error: stray '\376' in program ./new:
我正在开发一个 Android(现在只是 Android,以后可能是 iOS)应用程序,它在很大程度上依赖于拍照,将这些照片存储在某个服务器上,并能够在用户需要时检索任何照片这将是非常频繁的。 在深入
我是 codeigniter 的新手,我刚刚学会使用 codeigniter 已经两周了。我在一个 Controller 中使用超过 26 个功能,每个功能加载不同的 View 。我的问题是,当我加载
下面是我的 3 个 cpp 文件和 2 个头文件。我收到了天文数字的错误,而且大多数都非常不清楚。我是 C++ 的新手并且有 C#/Java 背景。 我很清楚以下可能是语法错误。提前感谢您的帮助。 主
我必须在 Java 程序中存储大量单词 (+200k),并且我想快速访问它们。我只需要知道给定的单词是否属于我的“词典”。我不需要像 这样的一对.如果可能的话,我正在标准库中搜索解决方案。 PS:也
我正在开发一个集成了其他 SDK(例如 Facebook SDK 3.5)的 iOS SDK。为了防止冲突并允许我的客户也导入这些 SDK,我想重命名我的代码中的所有类/枚举(例如,将 FBSessi
我的游戏中有很多角色,因此我有很多纹理。当加载纹理图集(包含大约 5 个不同的图像纹理)时,它会增加内存使用并将其保持在该数量。因此,更多的纹理只会使该数字不断上升,直到有时应用程序崩溃。我不需要同时
哇,大戏!框架有很多静态方法。在我上学的地方,我们被告知永远不要使用任何静态,但 Play!像没有明天一样使用它。这样可以吗?如果有,为什么? 我们(我和 7 个人)计划使用 Play!涉及 Web
我需要更改表中列的值,所以我需要这样做: update members set frequence = 1 where frequence <> 1 我有 700 万行受到影响,我需要分批更新 100
嗨,当我尝试将我的应用程序部署到 Heroku 时,我遇到了一些错误。 当我 pip freeze>requirements.txt 时,我收到此错误: “警告:无法生成分发要求 -lotly 2.7
我用 pthread 编写了一个多线程程序,使用生产者-消费者模型。 当我使用英特尔 VTune 分析器来分析我的程序时,我发现生产者和消费者在 pthread_mutex_unlock 上花费了大量
我有一个要求,我必须缓冲大量数据(以 GB 为单位)以供将来使用。由于没有足够的 RAM 可用于缓冲如此大量的数据,我决定将数据存储在文件中。 现在这里的陷阱是,当我将数据写入文件时,其他线程可能需要
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我是一名优秀的程序员,十分优秀!