【问题标题】:Mocking VB.NET Methods With Moq使用 Moq 模拟 VB.NET 方法
【发布时间】:2010-11-12 13:29:31
【问题描述】:

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

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

<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

mocked members service的设置无法编译,错误是:

重载解析失败,因为没有 可以使用可访问的“设置”调用 这些论点:

'公共职能 Setup(Of TResult)(表达式为 System.Linq.Expressions.Expression(的 System.Func(的 Services.IMembershipService, 结果)))作为 Moq.Language.Flow.ISetup(的 Services.IMembershipService, TResult)': 表达式不产生 一个值。

'公共功能设置(的 TResult)(表达式为 System.Linq.Expressions.Expression(的 System.Func(的 Services.IMembershipService, 结果)))作为 Moq.Language.Flow.ISetup(的 Services.IMembershipService, TResult)': 类型的数据类型 参数不能从 这些论点。指定数据 明确的类型可能会纠正这个 错误。

'公共职能 设置(表达式为 System.Linq.Expressions.Expression(的 System.Action(的 Services.IMembershipService))) 作为 Moq.Language.Flow.ISetup(的 服务.IMembershipService)': 表达式不产生值。

我错过了什么?每当我的类有我想要调用的方法时,我是否必须创建一个假类而不是使用 Moq?

编辑:

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

有没有人找到解决此问题的方法,或者我将不得不放弃 Moq 以使用伪造方法?

【问题讨论】:

    标签: vb.net unit-testing moq


    【解决方案1】:

    看来this 达成了交易。

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

    【讨论】:

      【解决方案2】:

      正如您所发现的,当前版本的 VB.NET (VB9) 仅允许返回值的 lambda 方法(即Function lambdas)。除了create a function to return a dummy value 之外,您对此无能为力。我目前无法对其进行测试,因此我不确定这对于这种情况是否可行。

      next version of VB.NET (VB10) 中,该语言将支持Sub lambda,并且在这些情况下应该有所帮助。

      似乎其他人对当前 Moq/VB.NET 组合也有不同程度的having trouble

      【讨论】:

      • :( 真的很惭愧,除此之外我真的很喜欢起订量。如果我向老板建议我们再推迟一年的开发,以便他们可以推出 VB10,我想他会杀了我!
      【解决方案3】:

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

      【讨论】:

      • 不幸的是,作为一小部分内部开发人员,我们无法证明 TypeMock 的成本是合理的。目前我们只是编写我们需要模拟为返回布尔值并等待 VB10 的函数的方法。
      【解决方案4】:

      在 Visual Studio 2010 中使用

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-18
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 2010-10-08
        相关资源
        最近更新 更多