如何在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")
答案 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
我发现这是一个非常讨厌的解决方案,但如果它能帮助某些人解决我遇到的同样问题,那么值得花时间发布这个问题;)