我正在尝试对使用成员资格提供程序更新用户详细信息的 Controller 操作进行单元测试。我正在使用 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
模拟成员(member)服务的设置无法编译,错误是:
Overload resolution failed because no accessible 'Setup' can be called with these arguments:
'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)': Expression does not produce a value.
'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)': Data type(s) of the type parameter(s) cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
'Public Function Setup(expression As System.Linq.Expressions.Expression(Of System.Action(Of Services.IMembershipService))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService)': Expression does not produce a value.
我错过了什么?每当我的类有我想要调用的方法时,我是否必须创建一个假类而不是使用 Moq?
编辑:
好吧,稍微阅读一下就会发现这是由于 VB 中使用 Function() 表达 lambda 的方式造成的,而 Function() 必须有一个结果。
有没有人找到解决这个问题的方法,或者我是否必须放弃 Moq 来使用伪造方法?
最佳答案
在 Visual Studio 2010 中使用
serviceMock.Setup(Sub(c) c.MethodName(paramName))
此外,请确保模拟实体 (serviceMock
) 被模拟为接口(interface),或者将 MethodName 声明为可重写。
关于vb.net - 使用 Moq 模拟 VB.NET 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1157679/