如何使用Microsoft Fakes Shims对VB.NET 4中的紧密耦合类进行单元测试,特别是对于构造函数

时间:2013-09-06 20:48:07

标签: vb.net unit-testing microsoft-fakes

Microsoft Fakes是一个相对较新的框架,我对这个问题的所有方面也相对较新,所以我需要详细解答。

我被赋予了“单元测试”应用程序的任务,我们将其称为旧应用程序(由Michael Feathers定义),尤其是Microsoft Fakes框架。我的经理建议Fakes的原因是它能够允许围绕外部依赖和API进行单元测试,特别是删除数据库依赖。

鉴于我在VB.net,一般的.NET框架以及一般的单元测试中都有弱背景,这个任务有点压倒性。无论如何,我想深入了解如何使用SHIM来绕过这些内部类依赖。我对SHIMS感兴趣的原因是速度更快,更容易实现的STUBS是因为这个应用程序中没有接口(我不太熟悉其他东西。)并且STUB需要接口。

现在,对于这个背景下的一个更具体的问题,我想帮助尝试单元测试一个类,比如由“字符串名称”和类型“地址地址”组成的类Person,并将它们用作构造函数参数。然后,我们可能会使用参数“string streetNumber”,“string street”以及具有自己的参数的用户类型“state State”来构造类Address ...

public class Person()

  Private mName As String
  Private mAddr As myclass.Address

   Public Sub New(ByVal name As string, ByVal addr As Address)
                      mName = name
                      mAddr = addr
  End Sub

其他地方......

public class Address()

  Private mStreet As String
  Private mState As myclass.State

   Public Sub New(ByVal street As String, ByVal state As State)
                      mStreet = street
                      mState = state
  End Sub

然后会有状态,包含它包含的任何属性和方法......

所以,我想知道如何构建单元测试以将类Person与其他类隔离,(地址然后状态),这样如果它们在dev或更改下,Person的单元测试仍将通过.. 。 有什么建议???

1 个答案:

答案 0 :(得分:0)

目前你似乎没有任何耦合问题,但对Fakes的性质感到困惑。存根可用于任何可以扩展或实现的类型,并且在可用时应优先于垫片,因为垫片与实现细节过于紧密相关。

在地址中,我可能会传入一个StubState,并传入一个StubAddress。常见的TDD实践要求你将State和Address设置为接口,这样在编写测试之前就不需要任何外部代码了,但是对于这类简单的类型可能不值得(可能是结构化的?我不知道我很清楚VB。)

你的目标应该是愚蠢的测试。只测试一件事的测试。在您的情况下,存根应该足以管理它,因为您已经在进行DI。

shims的主要用途是遗留代码,在这里您无法获得依赖项。这并不意味着它们是好事,但有时它们就是你所需要的。