Cómo comprobar si se llama a sync.WaitGroup.Done() en una prueba unitaria.
Digamos que tengo una función llamada “if” que se ejecuta de forma asíncrona como una rutina de go:
func f(wg * sync.WaitGroup){
defer wg.Done ()
// Haz algo
}
func principal(){
var wg sync.WaitGroup
wg.Add(1)
go f (& amp; wg)
wg.Wait () // Esperar hasta que se complete "f"
// ...
}
¿Cómo crearía una prueba de unidad para “f” que asegure que se llama a “wg.Done ()”?
Una opción es llamar a “wg.Done ()” en la prueba directamente después de que se llame a “f”. Si “f” no llama a “wg.Done ()”, la prueba provocará un error en tiempo de ejecución que no es agradable.
Otra opción sería crear una interfaz para “sync.WaitGroup”, pero eso parece un poco raro.
davy.ai
Para probar si
wg.Done ()
se llama en la funciónf
, podemos usar unsync.Mutex
para proteger una bandera booleana que indica si se llamó awg.Done ()
. En la prueba, podemos esperar a quewg.Wait ()
devuelva, luego verificar el valor de la bandera para asegurarnos de que se estableció en verdadero. Aquí hay un ejemplo de prueba:En esta prueba, creamos un
sync.Mutex
llamadolock
para proteger la variable booleanahecho
. Iniciamos una goroutine que llama af
y establece la banderahecho
en verdadero cuandof
ha terminado. En la rutina de prueba principal, llamamos awg.Wait ()
para esperar a quef
termine y luego verificamos si la banderahecho
se estableció en verdadero. Si no, fallamos la prueba con un mensaje de error.Esta prueba garantiza que
wg.Done ()
se llama en la funciónf
y quesync.WaitGroup
está sincronizando adecuadamente las goroutines.