如何在 Golang 中测试恐慌?
How to test a panic in Golang?
func good(json) string {
\do something
err = json.Unmarshal(body, &list)
if err != nil {
panic(fmt.Sprintf("Unable to parse json %s",err))
}
}
func Testgood_PanicStatement(t *testing.T) {
Convey("And Invalid Json return error",t, func() {
actual := good("garbage json")
So(func() {},shoulPanic)
So(actual ,ShouldEqual,"")
}
}
结果
第 34 行:- 无法解析 json,{%!e(字符串=无效字符“{”寻找对象键字符串的开头)%!e(int64=50)}
协程 8 [运行]:
问题:好像在传递垃圾的时候jsonfile.It出现了panic,没有执行任何So语句?如何修好了吗?
使用恢复()。
func Testgood_PanicStatement(t *testing.T) {
Convey("And Invalid Json return error",t, func() {
defer func() {
if r := recover(); r != nil {
So(func() {},shouldPanic)
So(actual ,ShouldEqual,"")
}
}()
actual := good("garbage json")
}
}
了解更多:
赞成 sadlil 的答案是正确的我想指出的是,恐慌函数不是好的做法。而是将恐慌转换为函数内部的错误并测试错误。
func good(json) (s string, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("Error in good: %v", r)
}
}()
\do something
err = json.Unmarshal(body, &list)
if err != nil {
# leaving the panic statement for demonstration. In this case
# you could just: return "", err
panic(fmt.Sprintf("Unable to parse json %s",err))
}
return
}
func good(json) string {
\do something
err = json.Unmarshal(body, &list)
if err != nil {
panic(fmt.Sprintf("Unable to parse json %s",err))
}
}
func Testgood_PanicStatement(t *testing.T) {
Convey("And Invalid Json return error",t, func() {
actual := good("garbage json")
So(func() {},shoulPanic)
So(actual ,ShouldEqual,"")
}
}
结果
第 34 行:- 无法解析 json,{%!e(字符串=无效字符“{”寻找对象键字符串的开头)%!e(int64=50)}
协程 8 [运行]:
问题:好像在传递垃圾的时候jsonfile.It出现了panic,没有执行任何So语句?如何修好了吗?
使用恢复()。
func Testgood_PanicStatement(t *testing.T) {
Convey("And Invalid Json return error",t, func() {
defer func() {
if r := recover(); r != nil {
So(func() {},shouldPanic)
So(actual ,ShouldEqual,"")
}
}()
actual := good("garbage json")
}
}
了解更多:
赞成 sadlil 的答案是正确的我想指出的是,恐慌函数不是好的做法。而是将恐慌转换为函数内部的错误并测试错误。
func good(json) (s string, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("Error in good: %v", r)
}
}()
\do something
err = json.Unmarshal(body, &list)
if err != nil {
# leaving the panic statement for demonstration. In this case
# you could just: return "", err
panic(fmt.Sprintf("Unable to parse json %s",err))
}
return
}