Pregunta

digamos que tengo un trabajador en segundo plano en una clase que realiza una consulta db en un subproceso en segundo plano.

quiero probar esta clase

así que me burlo de mi db y devuelvo alguna colección hasta ahora muy bien, Asegúrate de que mi trabajador de fondo llame al trabajo y entonces quiero asegurarme de que el acabado también haya sucedido.

He notado que la prueba pasa y falla aleatoriamente (creo que tiene algo que ver con los hilos)

cualquier sugerencia

¿Fue útil?

Solución

Puede tener una condición de carrera entre el subproceso de fondo y las afirmaciones / verificaciones.

Por ejemplo:

[Test]
public void TestWithRaceCondition()
{
    bool called = false;
    new Thread(() => called = true).Start();
    Assert.IsTrue(called);
}

El hilo no necesariamente termina antes de las afirmaciones, a veces lo hará y otras no. Una solución para este caso es unir el hilo de fondo:

[Test]
public void TestWithoutRaceCondition()
{
    bool called = false;
    var thread = new Thread(() => called = true);
    thread.Start();
    thread.Join()
    Assert.IsTrue(called);
}

Una forma de verificar si se trata de una condición de carrera es retrasar el subproceso de prueba (llame a Thread.Sleep durante mucho tiempo justo antes de la afirmación) y si la prueba deja de fallar, es una buena indicación de la condición de carrera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top