如何在 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")
  }
}

了解更多:

  1. Golang blog

赞成 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
}