如何在 Golang 中测试 panic?

3
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文件时,似乎会出现panic并且不执行任何So语句?如何修复它?

2个回答

4
使用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. Golang 博客

3

我希望指出,将 sadlil 的答案标记为正确并不是最好的做法。更好的方法是将 panic 转化为函数内部的错误并测试该错误。

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接