使用Moq模拟VB.NET方法

Nic*_*ick 6 vb.net unit-testing moq

我正在尝试对使用成员资格提供程序更新用户详细信息的控制器操作进行单元测试.我使用的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
Run Code Online (Sandbox Code Playgroud)

模拟的成员资格服务的设置将无法编译,错误是:

重载决策失败,因为无法使用以下参数调用可访问的"Setup":

'公共函数设置(Of TResult)(表达式为System.Linq.Expressions.Expression(Of System.Func(Of Services.IMembershipService,TResult)))作为Moq.Language.Flow.ISetup(Of Services.IMembershipService,TResult)' :表达式不会产生值.

'公共函数设置(Of TResult)(表达式为System.Linq.Expressions.Expression(Of System.Func(Of Services.IMembershipService,TResult)))作为Moq.Language.Flow.ISetup(Of Services.IMembershipService,TResult)' :无法从这些参数推断出类型参数的数据类型.明确指定数据类型可能会更正此错误.

'公共函数设置(表达式为System.Linq.Expressions.Expression(Of System.Action(Of Services.IMembershipService)))作为Moq.Language.Flow.ISetup(Of Services.IMembershipService)':表达式不生成值.

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

编辑:

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

有没有人为此找到了解决办法,还是我不得不放弃Moq伪造方法?

小智 8

在Visual Studio 2010中使用

serviceMock.Setup(Sub(c) c.MethodName(paramName))
Run Code Online (Sandbox Code Playgroud)

此外,请确保将模拟的实体(serviceMock)模拟为接口,或将MethodName声明为可重写.


Ste*_*ons 6

正如您所发现的,当前版本的VB.NET(VB9)只允许返回值的lambda方法(即Functionlambda).除了创建一个返回虚拟值的函数之外,除此之外没有什么可以做的.我现在无法测试它,所以我不确定这是否适用于这种情况.

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

似乎其他人也遇到了与当前Moq/VB.NET组合不同程度的麻烦.