VB.net Moq公共共享功能

时间:2014-02-28 10:03:13

标签: vb.net unit-testing tdd moq

我正在使用Moq框架在一个vb.net项目中进行测试。

我现在的情况是我想测试一个函数,其中有一个调用来自另一个类的'公共共享函数',我喜欢moq这个调用。 情况类似于

'Sub in Main Class
Public Sub StartProcess()
    Dim total As Integer = CommonData.GetTotal()
    ...
End Sub

'Function in CommonData class
Public Shared Function GetTotal()
    ...
    Dim total As Integer = database.GetTotal()
    ...
    Return total
End Sub

问题是我可以通过moq数据库调用来获取我想要的数据,因为它不是共享对象 但我喜欢做的是moq CommonData.GetTotal以避免所有内部执行 反正有吗?

1 个答案:

答案 0 :(得分:3)

你不能直接用Moq模拟共享函数(你必须使用像Typemock Isolator或Microsoft Fakes这样的框架来实际模拟共享函数)。

但是,您可以隐藏对接口后面的共享代码的调用,并模拟该接口的实现。

Interface ICommonData
    Function GetTotal() As Integer
End Interface

Public Sub StartProcess(commonData As ICommonData)
    Dim total As Integer = commonData.GetTotal()
    ...
End Sub

Public Class RealCommonData
    Implements ICommonData

     ...calls your shared function...
End Class

因此,您将在生产中使用RealCommonData,并在单元测试中使用ICommonData模拟。


或者,反过来说:

Interface ICommonData
    Function GetTotal() As Integer
End Interface

Public Class RealCommonData
 Implements ICommonData

   Function GetTotal() As Integer Implements...
        Dim total As Integer = database.GetTotal()
        ...
        Return total
  End Function
End Class

Module CommonData
    Shared _commonData As ICommonData

    Public Shared Function GetTotal()
        Return _commonData.GetTotal()
    End Function
End Module

因此,在生产中,您可以将CommonData._commonData设置为RealCommonData的实例,并将其设置为单元测试中的模拟。

通过这种方式,您可以像以前一样保持对CommonData.GetTotal()的调用,而无需更改此部分代码(我听说有些人称之为静态网关模式或类似内容)。