2
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=invalid character '{' 寻找对象键字符串的开头) %!e(int64=50)}

goroutine 8 [运行]:

问题:好像当我传递垃圾 json 文件时。它很恐慌并且不执行任何 So 语句?如何解决?

4

2 回答 2

3

使用恢复()。

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 博客
于 2017-07-12T09:18:39.457 回答
2

我想指出,支持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
}
于 2017-07-12T10:58:12.627 回答