使用反射来调用具有nil参数的函数会导致“使用零值参数调用”恐慌

时间:2014-10-12 02:01:15

标签: testing reflection go

我正在尝试测试接受“错误”类型参数的函数。在某些情况下,该功能应该是恐慌,我正在尝试测试场景。

但是,当我尝试在reflect.Call值上使用nil时(可以将其传递给接受某种类型“错误”的函数),它似乎会导致恐慌以下消息:

reflect: Call using zero Value argument

我找到了以下帖子,但我没有将其整合到我的功能中。

相关围棋游乐场:http://play.golang.org/p/cYQMQ6amPH

在上面的操场上,我希望调用InvocationCausedPanic(PanicOnErr, nil)来返回false,然而,上述反映的恐慌导致误报。

我可以对InvocationCausedPanicinvoke函数进行任何修改以使其工作(同时保留其测试其他无法接受nil作为参数的函数的能力 - 一个接受字符串的函数)?

问题可能在于如何调用函数?

我对InvocationCausedPanic(PanicOnErr, new(error))InvocationCausedPanic(PanicOnErr, error(nil))这样的事情无济于事。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:4)

如果参数值为nil,则使用函数参数类型的零值。

    if paramValue == nil {
        reflectedParams[paramIndex] = reflect.New(expectedType).Elem()
    } else {
        reflectedParams[paramIndex] = reflect.ValueOf(paramValue)
    }

playground

如果计算反射值,则可以简化代码,然后检查可分配性。通过此更改,不需要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)
    }
}