我正在尝试测试一个接受"error"类型参数的函数。该功能在某些情况下应该会崩溃,我正在尝试测试场景。
但是,当我尝试对nil
值(可以传递给接受"error"类型的函数(使用 reflect.Call
时,它似乎会导致以下消息的恐慌:
reflect: Call using zero Value argument
我找到了以下帖子,但我未能将其集成到我的函数中。
- https://groups.google.com/forum/#!topic/golang-nuts/apNcACpl_fI
- https://groups.google.com/forum/#!topic/golang-nuts/WOUft8EZQ1I
相关围棋游乐场:http://play.golang.org/p/cYQMQ6amPH
在上面的操场上,我希望呼叫InvocationCausedPanic(PanicOnErr, nil)
返回false
,但是,上述来自反射的恐慌正在导致误报。
我可以对InvocationCausedPanic
或invoke
函数进行任何修改以使这项工作(同时保留其测试其他无法接受nil
作为参数的函数的能力 - 例如接受字符串的函数(?
也许问题在于如何调用函数?
我已经尝试过InvocationCausedPanic(PanicOnErr, new(error))
或InvocationCausedPanic(PanicOnErr, error(nil))
之类的事情,但无济于事。
感谢您的任何建议。
如果参数值为 nil,则使用函数参数类型的零值。
if paramValue == nil {
reflectedParams[paramIndex] = reflect.New(expectedType).Elem()
} else {
reflectedParams[paramIndex] = reflect.ValueOf(paramValue)
}
操场
如果计算反射值,然后检查可分配性,则可以简化代码。通过此更改,不需要compatible
功能。
for paramIndex, paramValue := range params {
if paramValue == nil {
reflectedParams[paramIndex] = reflect.New(expectedType).Elem()
} else {
reflectedParams[paramIndex] = reflect.ValueOf(paramValue)
}
expectedType := funcType.In(paramIndex)
actualType := reflectedParams[paramIndex].Type()
if !actualType.AssignableTo(expectedType) {
errStr := fmt.Sprintf("InvocationCausedPanic called with a mismatched parameter type [parameter #%v: expected %v; got %v].", paramIndex, expectedType,actualType)
panic(errStr)
}
}