Как проверить панику на Голанге?

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 [работает]:

Вопрос: Кажется, что когда я передаю мусорный файл json. Он паникует и не выполняет ни одного из утверждений So? Как это исправить?

2 ответа

Решение

Используйте recovery ().

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. Блог Голанга

Утверждая правильный ответ 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
}
Другие вопросы по тегам