Как проверить панику на Голанге?
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")
}
}
Узнайте больше о:
Утверждая правильный ответ 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
}