这里只是一个简单的问题。我已经使用了Moq一段时间了,但是,到目前为止,它只用于存根而不是用于模拟。我正在尝试向开发人员介绍单元测试。我设置了一个简单的例子来解释这些概念,但我似乎无法让它发挥作用。可能是一些简单的事情,所以我想我会问你们所有人,看看我做错了什么:
<Test()> _
Public Sub Divide_DivideByZero_LogsError()
Dim mock = New Mock(Of ILogger)
With mock
Dim calc = New MyCalculator(New CalculatorData, .Object)
calc.Divide(55, 0)
.Verify(Function(x) CType(x,ILogger).WriteError(it.IsAny(of String),It.IsAny(Of String))))
End With
End Sub
我正在使用Moq版本3.2.416.3。我在.verify上收到错误,告诉我我用不正确的参数调用它。我只是想验证.WriteError是否被调用。任何帮助将不胜感激。
编辑: 好的,如果我将“.WriteError”从子(void返回)更改为返回布尔值的函数,它可以正常工作。 WriteError实际上不需要是一个函数。有谁知道为什么sub不起作用?
答案 0 :(得分:1)
编辑:好的,如果我将“.WriteError”从子(void返回)更改为返回布尔值的函数,它可以工作。 WriteError实际上不需要是一个函数。有谁知道为什么sub不起作用?
据我所知,VB9不支持匿名Subs(仅限函数),而且它是VB.net中Moq使用的严重阻止。 因此,很快,当您将WriteError签名从Sub更改为Function时,编译器已成功解析了Verify parametrer中匿名函数的返回类型。
答案 1 :(得分:0)
我认为您需要在实际调用Verifiable()
之前将其设为Verify()
。我不确定它是否可以自动验证。
恕我直言,我发现使用VerifyAll()
要比验证个别方法容易得多。即:
mock.Setup(Function(x) CType(x, ILogger).WriteError(It.IsAny(Of String), It.IsAny(Of String))) _
.Verifiable()
mock.Object.WriteError("test", "Test")
mock.VerifyAll()
不确定我是否能获得所有方法名称/签名,但您应该明白这一点。