Saltar al contenido

¿Utiliza TestInitialize o el constructor de la clase de prueba para preparar cada prueba? ¿y por qué?

Solución:

El constructor es solo una estructura proporcionada por el lenguaje. Cada marco de prueba parece tener su propio ciclo de vida controlado “inicializar”. Probablemente solo tendrá problemas al usar el constructor para mutar a sus locales.

MSTest: Obtienes una instancia completamente nueva de la clase de prueba por cada TestMethod. Este podría ser el único caso en el que está bien mutar sus locales en el constructor, inicializador o método de prueba y no afectar a los otros métodos de prueba.

public class TestsForWhatever
{
    public TestsForWhatever()
    {
        // You get one of these per test method, yay!
    }

    [TestInitialize] 
    public void Initialize() 
    {
        // and one of these too! 
    }

    [TestMethod]
    public void AssertItDoesSomething() { }

    [TestMethod]
    public void AssertItDoesSomethingElse() { }
}

MSpec: Solo obtienes uno Establish y Because por todas tus afirmacionesIt). Por lo tanto, no modifique a sus lugareños en sus afirmaciones. Y no dependa de las mutaciones de los locales en contextos básicos (si los usa).

[Subject(typeof(Whatever))]
public class When_doing_whatever
{
    Establish context = () => 
    { 
        // one of these for all your Its
    };

    Because of = () => _subject.DoWhatever();

    It should_do_something;
    It should_do_something_else;
}

Estas son algunas de las ventajas que encontré con TestInitialize.

  • Algunas variables ambientales (por ejemplo, TestContext) no son accesibles hasta después de que se crea una instancia de la clase de prueba.
  • Puede requerir la implementación con una clase derivada marcando un resumen del método TestInitialize base.
  • Puede anular fácilmente un método TestInitialize base y determinar si llamar al impl base antes del impl derivado, después o en absoluto. Por el contrario, si deriva una clase de prueba de una clase de prueba base, en el caso de un constructor sin parámetros, se llamará al ctor base tanto si lo desea como si no.
  • Su definición explícita aclara las intenciones y complementa el método TestCleanup. Podría argumentar que puede crear un destructor para cada constructor, pero no está garantizado que MS Test maneje los destructores como cabría esperar.

La principal ventaja de usar TestInitialize () o ClassInitialize () en lugar de la instancia de la clase de prueba o los constructores estáticos es su naturaleza explícita. Comunica claramente que está realizando una configuración antes de sus pruebas. Hacer esto de manera consistente debería mejorar la capacidad de mantenimiento a largo plazo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *