使用Moq模拟VB.NET方法

8

我正在尝试对使用成员资格提供程序更新用户详细信息的控制器操作进行单元测试。我正在使用Moq,到目前为止它很容易使用。

问题是我似乎无法将其模拟为调用不返回任何内容的方法。

<TestMethod()> _
Public Sub Can_Update_User()
  ' Arrange
  _membershipService.Setup(Function(x) x.UpdateUser(It.IsAny(Of MembershipUser)))
  Dim controller As New UsersController(_membershipService.Object, _roleProvider.Object, _supportWorksService.Object, _portalClientService.Object)
  ' Act
  Dim result As ViewResult = controller.Edit("testUser", New FormCollection)
  ' Assert
  Assert.AreEqual("Index", result.ViewName)
End Sub

模拟成员服务的设置无法编译,错误如下所示:
重载解析失败,因为没有可访问的“Setup”可以使用这些参数进行调用: -“Public Function Setup(Of TResult)(expression As System.Linq.Expressions.Expression(Of System.Func(Of Services.IMembershipService, TResult))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService, TResult)”:表达式不产生值。 -“Public Function Setup(Of TResult)(expression As System.Linq.Expressions.Expression(Of System.Func(Of Services.IMembershipService, TResult))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService, TResult)”:类型参数的数据类型不能从这些参数中推断出来。显式指定数据类型可能会纠正此错误。 -“Public Function Setup(expression As System.Linq.Expressions.Expression(Of System.Action(Of Services.IMembershipService))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService)”:表达式不产生值。
我错过了什么?难道每当我的类有一个我想要调用的方法时,我都必须创建一个虚假类而不是使用Moq吗?
编辑: 好吧,一些阅读提示这是由于VB中使用Function()表达Lambda方式必须具有结果。
是否有人找到了解决方法或者我必须放弃使用Moq来伪造方法?
4个回答

10

在 Visual Studio 2010 中使用

serviceMock.Setup(Sub(c) c.MethodName(paramName))

此外,请确保被模拟的实体 (serviceMock) 要么被模拟为一个接口,要么在其 MethodName 上声明为可重写。


6
正如您所发现的那样,目前版本的VB.NET(VB9)仅允许返回值的lambda方法(即Function lambda)。除了创建一个返回虚拟值的函数之外,你没有太多办法。我目前无法测试它,因此我不确定这是否是这种情况的可行解决方法。
下一个版本的VB.NET(VB10)中,该语言将支持Sub lambdas,并应有助于解决这些问题。
似乎其他人也遇到了与当前Moq/VB.NET组合不同程度的困难。

真遗憾,除此之外我真的很喜欢 Moq。如果我建议老板再推迟一年开发,以便他们能够推出 VB10,我想他会杀了我! - Nick

1

看起来this已经敲定了。

有点失望——调查花了我很多时间。 :/


0

3
很遗憾,作为一个小团队的内部开发人员,我们无法承担 TypeMock 的成本。目前我们只能将需要模拟的方法编写为返回布尔值的函数,并等待 VB10 的到来。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接