我有一个功能可以更新 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:表达式不是方法调用:u => (u.IsApproved == True)
在 VB 中使用 Moq 的例子太少了,我无法弄清楚,任何帮助将不胜感激。
这是 VB.NET 10 (.NET 4.0) 中的 ASP.NET MVC2 应用程序
EDIT:
好吧,事实证明在 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)
for
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)
有时我只是看不到简单的解决方案:)