在VB.NET中使用Moq的VerifySet

时间:2010-07-12 15:41:48

标签: vb.net moq

我有一个更新asp.net会员提供商用户的功能。

<AcceptVerbs(HttpVerbs.Post)>
Public Function EnableUser(ByVal id As String) As JsonResult
  Dim usr As StargatePortalUser = _membershipService.GetUser(id, Nothing)
  usr.IsApproved = True
  _membershipService.UpdateUser(usr)
  Dim response As New AjaxResponse(usr.UserName)
  Return Json(response)
End Function

我正在尝试测试此函数以确保正确设置IsApproved属性

<TestMethod()>
Public Sub Service_Can_Enable_A_User_Account()
  ' Arrange
  Dim usr As New Mock(Of MembershipUser)
  usr.SetupProperty(Function(u) u.IsApproved)

  _membershipService.Setup(Function(m) m.GetUser(It.IsAny(Of String), It.IsAny(Of Boolean))).Returns(usr.Object)

  Dim target As New UsersController(_membershipService.Object)
  target.ControllerContext = New ControllerContext(FakeAuthenticatedHttpContext("testuser", String.Empty, True, True, False), New RouteData, target)

  ' Act
  Dim actual As JsonResult = target.EnableUser("userId")

  ' Assert
  Assert.IsTrue(DirectCast(actual.Data, AjaxResponse).Success)
  _membershipService.Verify(Sub(m) m.UpdateUser(It.IsAny(Of MembershipUser)), Times.Once)
  usr.Verify(Function(u) u.IsApproved = True)
End Sub

当我尝试验证IsApproved属性是否已设置为True时,将返回异常:

  

System.ArgumentException:Expression不是方法调用:u =&gt; (u.IsApproved == True)

在VB中使用Moq的例子很少,我无法弄明白,任何帮助都会受到赞赏。

这是VB.NET 10(.NET 4.0)中的ASP.NET MVC2应用程序

编辑:

好的,事实证明它在VB中并不那么直接。

usr.Verify(Function(u) u.IsApproved = True)

需要

usr.VerifySet(Function(u) InlineAssignHelper(u.IsApproved, True))

您需要添加以下功能:

Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
  target = value
  Return value
End Function

进一步编辑:

围绕这个问题思考,我找到了一个更简单的解决方案。我改变了

Dim usr As New Mock(Of MembershipUser)
usr.SetupProperty(Function(u) u.IsApproved)
_membershipService.Setup(Function(m) m.GetUser(It.IsAny(Of String), It.IsAny(Of Boolean))).Returns(usr.Object)

代表

Dim usr As New Mock(Of MembershipUser)
usr.SetupProperty(Function(u) u.IsApproved)
Dim usrObj = usr.Object
_membershipService.Setup(Function(m) m.GetUser(It.IsAny(Of String), It.IsAny(Of Boolean))).Returns(usrObj)

然后可以替换

usr.VerifySet(Function(u) InlineAssignHelper(u.IsApproved, True))

更直接的

Assert.IsTrue(usrOb.IsApproved)

有时我只是看不到简单的解决方案:)

2 个答案:

答案 0 :(得分:1)

您想使用以下内容(来自http://code.google.com/p/moq/wiki/QuickStart):

  

//或直接验证setter   mock.VerifySet(foo =&gt; foo.Name =“foo”);

现在你正在进行的是比较而不是作业,所以即使Moq确实处理了这个陈述而没有例外,它仍然不会是你的意思。

答案 1 :(得分:0)

这可能有点晚了,但是我遇到了同样的问题,解决方法比使用InlineAssignHelper方法更简单。

只需将 功能 更改为,就可以了。

所以试试这个:

usr.VerifySet(Sub(u) u.IsApproved = True)