2014-02-28 97 views
1

我正在使用Moq框架在一個vb.net項目中進行測試。VB.net Moq公共共享函數

我現在的情況是我想測試一個函數,它內部有一個來自另一個類的「公共共享函數」調用,我喜歡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 

的事情是,我可以起訂量的數據庫調用來獲得我想要的數據,因爲不是一個共享對象 但我喜歡做的起訂量CommonData.GetTotal避免一切內部執行 有沒有辦法做到這一點?

回答

2

你不能直接用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 

所以,你會在生產和ICommonData在單元測試模擬使用RealCommonData


或者,反過來想:

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._commonDataRealCommonData一個實例,並在單元測試中一個模擬。

這樣,您可以像以前一樣保持對CommonData.GetTotal()的調用,而無需更改代碼的這部分內容(我聽到有人稱之爲靜態網關模式或類似的東西)。

+0

感謝Dominic,這是我的想法,我更喜歡不使用這個接口,因爲我在整個應用程序中使用了這個類,它很容易訪問而不需要實例化。 也許我可以改變成單身模式來混合使用這兩種方法。 謝謝 – ajimenez

+0

你當然可以換個角度:將共享函數的代碼放入一個實現了接口的非共享類/函數中,讓共享函數在該接口上工作(並將實例存儲將在共享領域工作)。然後,您可以保留使用共享函數的代碼。 – sloth

+0

查看我的編輯例子。 – sloth