如何在VB.NET中使用Rhino Mocks模拟方法(自定义行为)

时间:2009-02-13 12:51:20

标签: vb.net mocking rhino-mocks

如何在VB.Net中使用RhinoMocks模拟一个方法?我发现的参考文献是C#:

 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")

2 个答案:

答案 0 :(得分:3)

不幸的是,你试图同时做一个Sub lambda和一个Statement Lambda。 VS2008都不支持(但将在即将推出的VS版本中)。这是适用于VB

的扩展版本

我猜的是m_list的类型

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

答案 1 :(得分:1)

我从来没有嘲笑过一个委托和一个lambda的东西,所以我无法给出这个问题的完整解决方案,但我确实想要分享Rhino Mocks 3.5中常用的“AssertWasCalled”函数的一些示例代码vb开发人员,因为我花了一些时间试图解决这个问题...(请记住,为简洁起见,下面的内容很简单)

这是测试中的方法 - 可能在用户对象的服务类中找到

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

这是断言存储库方法被称为

的交互式测试
  <TestMethod()> _
  Public Sub Should_Call_Into_Repository_For_DeleteProjectById()
    Dim Repository As IUserRepository = MockRepository.GenerateStub(Of IUserRepository)()
    Dim Service As IUserService = New UserService(Repository)

    Service.DeleteUserByID(Nothing)

    Repository.AssertWasCalled(Function(x) Wrap_DeleteUserByID(x))
  End Sub

这是用于确保此工作的包装函数w / vb

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

    Return Nothing
  End Function

我发现这是一个非常讨厌的解决方案,但如果它能帮助某些人解决我遇到的同样问题,那么值得花时间发布这个问题;)