Prueba de pánico en Go
Cuando se escribe pruebas en Go, verificar los pánico puede ser una técnica útil. Sin embargo, a diferencia de Java, GO no tiene una sintaxis explícita para manejar los pánico selectivamente.
Considere el siguiente ejemplo:
func f(t *testing.T) { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) } }() OtherFunctionThatPanics() t.Errorf("The code did not panic") }
Este código intenta recuperarse de cualquier pánico en Other FunctionThatPanics usando la función de recuperación. Sin embargo, puede ser difícil determinar si la función entró en pánico o si no se produjo un pánico.
solución
el enfoque recomendado es centrarse en probar la ausencia de un pánico. Esto se puede lograr invirtiendo la lógica y asegurando que ocurra un pánico si se espera:
func TestPanic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() // Code under test OtherFunctionThatPanics() }
Additionally, more advanced testing frameworks such as Ginkgo or Gomega provide built-in matchers for asserting the occurrence of panics:
Expect(OtherFunctionThatPanics).To(Panic())
Utility Functions
For convenience, Puede crear una función genérica para afirmar pánico:
func assertPanic(t *testing.T, f func()) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() f() }
Esta función se puede usar de la siguiente manera:
func TestPanic(t *testing.T) { assertPanic(t, OtherFunctionThatPanics) }
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3