gpt4 book ai didi

c# - 单元测试 : how to test methods with a lot of underlying objects and business logic

转载 作者:行者123 更新时间:2023-11-30 13:47:59 24 4
gpt4 key购买 nike

我对单元测试真的很陌生,虽然我花了很多时间进行研究,但我无法找到适合我的案例的正确方法。

我的代码库很大(大约 3 年的工作),不幸的是耦合度很高,很难测试,而且从未对其进行过单元测试。

例如,当尝试测试集合类时 ProductCollection ,更具体地说,bool MoveElementAtIndex(Product productToMove, int newIndex)其中,我遇到了以下问题:

  • 首先我必须初始化这个 new ProductCollection()
  • 构造函数初始化另一个手工制作的类:new KeyedList<ID, Product> .我想这不应该在这个构造函数中调用,因为我没有测试 KeyedList .
  • 接下来,我要向这个 ProductCollection 添加 3 个产品.
  • 然后我首先创建这 3 个 new Product() .
  • 但是Product的构造函数类做几件事
  • 它为新创建的产品计算一个唯一的 ID:this.ID = IDUtils.ComputeNewIDBasedOnTheMoonPhase() .我想我也不应该对此进行测试,因为这不是我的范围。我应该如何避免这种深度的调用?
  • 相同的 Product 构造函数为此产品分配了一些默认属性:this.Properties = new ProductProperties(folderPathToDefaultProperties) .这不应该从我的简单 FieldCollection.MoveElementAtIndex 调用测试,对吗?
  • 假设我现在终于有了我的产品对象,我正在尝试将它们添加到我的收藏中。
  • 但是ProductCollection.Add(MyProduct)检查底层的 KeyedList 是否已经包含该产品。这也是我应该避免的业务逻辑,与我的测试无关。问题是如何?
  • 此外,在这个Add方法,会引发一些事件,通知系统几件事情(例如,新产品已添加到集合中)。我想这些也不应该被解雇。
  • 最后,当我添加我的产品时,我将调用所需的 SUT:移动元素方法。
  • 但是这个方法也有可能超出我的测试范围的逻辑:它验证底层 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com