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(string =无效字符'{'寻找对象键字符串的开头)%!e(int64 = 50)}
goroutine 8 [正在运行]:
问题:好像我正在传递垃圾json文件。它是恐慌并且不执行任何So语句?如何解决?
答案 0 :(得分:2)
使用recover()。
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")
}
}
了解更多关于:
答案 1 :(得分:1)
提升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
}