我正在使用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以避免所有内部执行 反正有吗?
答案 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()
的调用,而无需更改此部分代码(我听说有些人称之为静态网关模式或类似内容)。