我正在尝试对使用成员资格提供程序更新用户详细信息的控制器操作进行单元测试。我使用的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
模拟成员资格服务的设置无法编译,错误是:
重载解析失败,因为没有 可以调用可访问的“设置” 这些论点:
'公共职能 设置(Of Traesult)(表达为 System.Linq.Expressions.Expression(中 System.Func(中 Services.IMembershipService, TResult)))As Moq.Language.Flow.ISetup(中 Services.IMembershipService, TResult)':表达不会产生 一个值。
'公共功能设置(Of TResult)(表达为 System.Linq.Expressions.Expression(中 System.Func(中 Services.IMembershipService, TResult)))As Moq.Language.Flow.ISetup(中 Services.IMembershipService, TResult)':类型的数据类型 参数不能从中推断出来 这些论点。指定数据 明确的类型可以纠正这个 错误。
'公共职能 设置(表达为 System.Linq.Expressions.Expression(中 System.Action(中 Services.IMembershipService)))作为 Moq.Language.Flow.ISetup(中 Services.IMembershipService)“: 表达式不会产生值。
我错过了什么?我是否必须创建一个假类,而不是在我的班级有一个我想要调用它的方法时使用Moq?
编辑:
好的,有点阅读表明这是由于使用Function()在VB中表达lambda的方式,必须有结果。
有没有人为此找到了解决办法,还是我不得不放弃Moq伪造方法?
答案 0 :(得分:8)
在Visual Studio 2010中使用
serviceMock.Setup(Sub(c) c.MethodName(paramName))
此外,请确保将模拟的实体(serviceMock
)模拟为接口,或将MethodName声明为可重写。
答案 1 :(得分:6)
正如您所发现的,当前版本的VB.NET(VB9)只允许返回值的lambda方法(即Function
lambdas)。除create a function to return a dummy value之外,除了next version of VB.NET之外,你所做的事情并不多。我现在无法测试它,所以我不确定这是否适用于这种情况。
在having trouble(VB10)中,该语言将支持Sub
lambda,并且在这些情况下应该有所帮助。
似乎其他人也与当前的Moq / VB.NET组合有不同程度的{{3}}。
答案 2 :(得分:1)
似乎this密封了这笔交易。
有点令人失望 - 调查花了我很多时间。 :/
答案 3 :(得分:0)
Typemock为此目的支持VB.NET友好API: http://site.typemock.com/vbpage/2009/9/10/unit-testing-vbnet.html