如何在Golang中测试恐慌?

时间:2017-07-12 08:39:41

标签: json unit-testing go goconvey

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语句?如何解决?

2 个答案:

答案 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. Golang blog

答案 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
}