8

我正在尝试对使用成员资格提供程序更新用户详细信息的控制器操作进行单元测试。我正在使用迄今为止很容易使用的最小起订量。

问题是我似乎无法让它模拟对不返回任何内容的方法的调用。

<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

模拟会员服务的设置不会编译,错误是:

重载解析失败,因为无法使用这些参数调用可访问的“设置”:

'公共功能设置(TResult)(表达式为 System.Linq.Expressions.Expression(系统.Func(服务.IMembershipService,TResult)))作为 Moq.Language.Flow.ISetup(Service.IMembershipService,TResult)' : 表达式不产生值。

'公共功能设置(TResult)(表达式为 System.Linq.Expressions.Expression(系统.Func(服务.IMembershipService,TResult)))作为 Moq.Language.Flow.ISetup(服务.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?

编辑:

好的,一点点阅读表明这是由于 lambda 在 VB 中使用 Function() 表示的方式,它必须有一个结果。

有没有人找到解决这个问题的方法,或者我将不得不放弃起订量来伪造方法?

4

4 回答 4

10

在 Visual Studio 2010 中使用

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

此外,请确保模拟实体 ( serviceMock) 被模拟为接口,或者将 MethodName 声明为可覆盖。

于 2011-02-23T22:15:11.800 回答
6

正如您所发现的,当前版本的 VB.NET (VB9) 仅允许返回值的 lambda 方法(即Functionlambdas)。除了创建一个返回 dummy value 的函数之外,您实际上无能为力。我目前无法对其进行测试,因此我不确定这对于这种情况是否可行。

下一版本的 VB.NET (VB10) 中,该语言将支持Sublambda,并且在这些情况下应该会有所帮助。

似乎其他人在使用当前的 Moq/VB.NET 组合时也遇到了不同程度的问题。

于 2009-07-21T19:37:11.923 回答
1

看来敲定了交易。

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

于 2009-07-21T19:18:23.927 回答
0

为此,Typemock 支持 VB.NET 友好 API:http: //site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html

于 2009-12-22T21:46:54.070 回答