gpt4 book ai didi

vb.net - 如何在 VB.NET 中为 TDD 伪造一个非常复杂的对象

转载 作者:行者123 更新时间:2023-12-04 04:45:46 24 4
gpt4 key购买 nike

假设我有一个名为 CIRCLE 的类(class),还有一个名为 SQUARE 的类(class)。
在每个类中,我都有一个名为 area 的公共(public)函数。 (计算
圆的面积,正方形的面积。)

我也有一堂 iMath 课。在这个类中,我有一个函数 ADD

    Public Function ADD(byval c as CIRCLE, byval s as SQUARE) 
Return c.area() + s.area()
End Function

现在我想对 ADD 函数进行单元测试。
显然,对于这个非常简单的问题,我可以轻松地创建一个圆形对象和一个方形对象来对我的 ADD 函数进行单元测试。然而,
假设我的 Circle 对象和 Square 对象是非常复杂的对象,很难创建对象,因为它们继承并包含许多其他依赖项。在这种情况下,
  • 如何伪造 CIRCLE 和 SQUARE 对象? (注意:CIRCLE 和 SQUARE 类没有 Public Sub New 而没有任何参数)
  • 如何伪造 CIRCLE 和 SQUARE 对象的面积函数的结果(我只需要一个数字来测试我的 ADD 函数,我不在乎面积是如何计算的)
  • 最佳答案

    如果您将 CIRCLE 的所有成员设为和 SQUARE类(class) Overridable ,然后您可以继承它们并使用 stub 覆盖所有成员,例如:

    Public Class Circle
    Public Overridable Function Area() As Integer
    ' Complicated logic
    End Function
    End Class

    Public Class MockCircle
    Inherits Circle

    Public Overrides Function Area() As Integer
    Return 10
    End Function
    End Class

    但是,如果原始 CIRCLE类在其构造函数中需要一堆难以创建的参数,那么这对您没有任何帮助,因为 MockCircle仍然需要类来调用基本构造函数。

    最好的解决方案是使用接口(interface)。而不是让你的 ADD方法接受一个具体的 CIRCLE对象,让它请求一个实现 ICircle 的对象界面改为:
    Public Interface ICircle
    Function Area() As Integer
    End Interface

    Public Class Circle
    Implements ICircle

    Public Function Area() As Integer Implements ICircle.Area
    ' Complicated logic
    End Function
    End Class

    Public Class MockCircle
    Implements ICircle

    Public Function Area() As Integer Implements ICircle.Area
    Return 10
    End Function
    End Class

    Public Class MyMath
    Public Function Add(c As ICircle, s As ISquare) As Integer
    Return c.Area() + s.Area()
    End Function
    End Class

    现在, CIRCLE 是什么并不重要。 requires 在其构造函数中,因为您已将其完全排除在等式之外。现在,你可以给 ADD方法是 CIRCLE对象或 MockCircle对象,它会以任何一种方式工作。 MockCircle对象不继承自 CIRCLE ,因此它不共享任何复杂的依赖项。这种方法实际上也有一个方便的名称。它被称为依赖注入(inject)(DI)。如果您要进行大量单元测试,那么值得您花时间对 DI 进行一些研究。理想情况下, CIRCLE 的依赖关系类也都可以通过接口(interface)完成,因此您甚至可以轻松创建 CIRCLE对象通过为其依赖项提供所有模拟对象。

    我也觉得有义务提及您的代码的一些表面问题。为了与 .NET 框架和 Microsoft 标准保持一致,您应该对所有方法和类名称使用 PascalCase。例如,它应该是 Add而不是 ADD , 它应该是 CircleSquare而不是 CIRCLESQUARE .此外, iMath类名不应以字母“i”开头。根据 Microsoft 标准,将“I”放在类型名称的开头意味着它是一个接口(interface),而不是一个类。我看到的最后一个问题是您的 ADD函数没有指定返回类型。您应该始终指定所有函数的返回类型。例如,在我的示例中,我将其更改为返回 As Integer .

    关于vb.net - 如何在 VB.NET 中为 TDD 伪造一个非常复杂的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18207962/

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