2009-02-13 76 views
2

如何在VB.Net中使用RhinoMocks模擬一種方法?我發現的引用是在C#中:如何在VB.NET中使用Rhino Mocks模擬一種方法(自定義行爲)

Expect.Call(delegate{list.Add(0);}).IgnoreArguments() 
    .Do((Action<int>)delegate(int item) { 
    if (item < 0) throw new ArgumentOutOfRangeException(); 
}); 

SharpDevelop的轉換這:

Expect.Call(Function() Do 
      list.Add(0) 
      End Function).IgnoreArguments().Do(DirectCast(Function(item As Integer) Do 
         If item < 0 Then 
          Throw New ArgumentOutOfRangeException() 
         End If 
         End Function, Action(Of Integer))) 

但是,這並不工作,要麼(不編譯)。

這就是我想要做的:創建一個新對象並調用設置該方法某些屬性的方法。在現實生活中,這種方法將使用數據庫中找到的值填充屬性。在測試中,我想用自定義方法/委託來嘲笑這個方法,這樣我就可以自己設置屬性(不需要去數據庫)。

在僞代碼,這就是我想要做的事:

Dim _lookup As LookUp = MockRepository.GenerateMock(Of LookUp)() 
_luvalue.Expect(Function(l As LookUp) l.GetLookUpByName("test")).Do(Function(l As LookUp) l.Property = "value") 

回答

3

不幸的是你試圖做一個兩分拉姆達和聲明LAMBDA。在VS2008中都不支持(但將在即將到來的VS版本中)。這裏是擴展版本將爲VB工作

我猜在

Class MockHelper 
    Dim m_list as new List(Of Object) 

    Public Sub New() 
    Expect(AddressOf CallHelper).IgnoreArguments().Do(AddressOf Do Hepler) 
    End Sub 

    Private Sub CallHelper() 
    m_list.Add(0) 
    End Sub 

    Private Sub DoHelper(ByVal item as Integer) 
    if item < 0 Then 
     Throw New ArgumentOutOfRangeException 
    End If 
    End Sub 
End Class 
+0

@JaredPar我與同樣的問題需要模擬(或存根)的VB.NET SUB戰鬥。你的回答似乎解決了這個問題,但我不清楚如何在unti測試中使用MockHelper類。你能提供附加的細節嗎? – Rick 2009-04-28 15:58:08

1

我從來沒有嘲笑的東西W¯¯m_list類型/既是代表和拉姆達所以我不能給出一個完全解決這個問題,但我確實想分享一些Rhino Mocks 3.5中常見的「AssertWasCalled」函數的示例代碼,因爲我花了一些時間嘗試討論這個......(請記住,下面的代碼很簡單爲簡潔起見)

這是被測方法 - 可能在用戶對象的服務類中找到

Public Sub DeleteUserByID(ByVal id As Integer) Implements Interfaces.IUserService.DeleteUserByID 
     mRepository.DeleteUserByID(id) 
End Sub 

這是交互式測試斷言庫方法被調用

這是用來確保這個包裹函數工作瓦特/ VB

Function Wrap_DeleteUserByID(ByVal Repository As IUserRepository) As Object 
    Repository.DeleteUserByID(Nothing) 

    Return Nothing 
    End Function 

我發現這是一個非常討厭的解決方案,但如果它幫助有相同的問題我有它值得花時間來發布這個;)

相關問題