Dei*_*ity 2 testing reflection go
我正在尝试测试一个接受“错误”类型参数的函数。该函数在某些情况下应该会出现恐慌,我正在尝试测试场景。
然而,当我尝试使用reflect.Call一个nil值(可以传递到接受“错误”类型的函数)时,它似乎会导致出现以下消息的恐慌:
reflect: Call using zero Value argument
Run Code Online (Sandbox Code Playgroud)
我找到了以下帖子,但我未能将其集成到我的功能中。
相关围棋游乐场:http://play.golang.org/p/cYQMQ6amPH
在上面的操场中,我希望调用InvocationCausedPanic(PanicOnErr, nil)return 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)
}
Run Code Online (Sandbox Code Playgroud)
如果计算反射值然后检查可分配性,则可以简化代码。通过此更改,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)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2581 次 |
| 最近记录: |