使用最小起订量';VB.NET中的验证集

使用最小起订量';VB.NET中的验证集,vb.net,moq,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.Update

我有一个更新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
需要

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)
为了

然后可以替换

usr.VerifySet(Function(u) InlineAssignHelper(u.IsApproved, True))
用更直接的

Assert.IsTrue(usrOb.IsApproved)

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

您想使用以下(从):

//或者直接验证setter mock.VerifySet(foo=>foo.Name=“foo”)


现在,您输入的是比较而不是赋值,因此即使Moq毫无例外地处理了语句,它也不会按照您的意思执行。

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

只需将功能更改为子功能,它就可以工作了

因此,请尝试以下方法:

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

好,将usr.Verify(函数(u)u.IsApproved=True)更改为usr.VerifySet(函数(u)u.IsApproved=True)。异常已略微更改为“System.ArgumentException:Expression不是属性设置器调用。”嗯,通过转换器运行C#给了我mock.VerifySet(函数(foo)InlineAssignHelper(foo.Name,“foo”))我真希望Moq在VB中有一些文档。@Nick:IsApproved是属性吗?
SetupSet
内容就是专门针对这一点的。换句话说,为了能够模拟/存根一个值的设置,它需要是一个
虚拟的
(不记得VB怎么称呼它!)方法(属性的setter部分就是这个)。在C#中也没有一种简洁的方法可以做到这一点(我建议,如果设置足够重要,能够存根,那么首先应该将其作为属性而不是原始助理公开)。我可能没有充分阅读(rewad:我没有阅读)您的特定代码,使我完全正确,但我认为您已经了解了是的,IsApproved是MembershipUser上的一个属性。我想出了一个更简单的解决方案(见上文),尽管让复杂的解决方案也能工作起来很好:)@Nick:simplesolutions-FTW。一般来说,我认为在这种情况下,断言与模拟验证之间的切换点是当它位于被测试的主对象之外的对象上时。我很少将这种性质的公共协议作为setter公开(即,我会有一个MarkApproved)。但很明显,YMMV——据我所知,你甚至不拥有我们正在谈论的这个班级。
usr.VerifySet(Function(u) InlineAssignHelper(u.IsApproved, True))
Assert.IsTrue(usrOb.IsApproved)
usr.VerifySet(Sub(u) u.IsApproved = True)