Skip to main content

Command Palette

Search for a command to run...

- Stub -

Updated
2 min read
- Stub -

Doble de prueba usado para simular una dependencia externa que envía información hacia la unidad de código.

Permite controlar a nuestro antojo la información recibida por la unidad de código.

Pueden existir varios Stub en una prueba.

Ya que inserta información a la prueba NO SE HACEN VALIDACIONES SOBRE STUBS.

class Persona {
  constructor(private _nombre: string, private _apellido: string) {}

  public get nombre() {
    return this._nombre;
  }

  public get apellido() {
    return this._apellido;
  }
}

/**
 * Interfaz requerida para leer personas desde una
 * base de datos
 * */
interface ILectorDePersonasDeBD {
  leerTodasLasPersonas(): Promise<Array<Persona>>;
}

/**
 * Implementación de un Stub de ILectorDePersonasDeBD
 * Con este stub podemos simular que una base de datos
 * retorna ciertas personas
 */
class StubLectorDePersonasDeBD implements ILectorDePersonasDeBD {
  constructor(private personas: Array<Persona>) {}

  async leerTodasLasPersonas(): Promise<Persona[]> {
    return this.personas;
  }
}

/**
 * Clase real que vamos a probar
 */
class MapeadorDePersonas {
  /**
   * Inicializa una instancia de MapeadorDePersonas
   * @param lectorDePersonasDeBD Fuente de datos desde la cual leer personas
   */
  constructor(private lectorDePersonasDeBD: ILectorDePersonasDeBD) {
    /**
     * Por favor note que estamos esperando una instancia de ILectorDePersonasDeBD
     * Éste es el truco que nos permite enviar un Stub para simular una base de
     * datos real con nuestros datos falsos
     */
  }

  /** Método de MapeadorDePersonas que queremos probar*/
  async mapearPersonaANombreCompleto(): Promise<Array<String>> {
    const personas = await this.lectorDePersonasDeBD.leerTodasLasPersonas();

    return personas.map(
      (persona: Persona) => `${persona.nombre} ${persona.apellido}`
    );
  }
}

/** Inicio de la pruebas */

/** Inicializar las personas para la prueba */
const enriqueBunbury = new Persona("Enrique", "Bunbury");
const pedroInfante = new Persona("Pedro", "Infante");

/** Crear un Stub para simular que dos personas son leídas desde la base de datos a
 * la instancia de MapeadorDePersonas
 */
const stubLectorDePersonasDeBD: ILectorDePersonasDeBD =
  new StubLectorDePersonasDeBD([enriqueBunbury, pedroInfante]);

/** Enviamos el StubLectorDePersonasDeBD al MapeadorDePersonas a través del constructor*/
const mapeadorDePersonas: MapeadorDePersonas = new MapeadorDePersonas(
  stubLectorDePersonasDeBD
);

/** Llamamos el método mapearPersonaANombreCompleto para validar que está mapeando correctamente
 * cada persona a un nombre completo
 */
mapeadorDePersonas.mapearPersonaANombreCompleto().then((nombresCompletos) => {
  const expectedFullNames = ["Enrique Bunbury", "Pedro Infante"];
  nombresCompletos.forEach((item, index) => {
    /** Simula la validación de la prueba */
    item === expectedFullNames[index];
  });
});

/** Fin de la prueba */

🇺🇸 English version

Pruebas Unitarias

Part 9 of 19

Las pruebas unitarias son un vigilante incansable que supervisan tu software para asegurar que siempre se comporte como se espera. En esta serie te presentaré sus conceptos básicos.

Up next

- Mock -

Doble de prueba usado para simular una dependencia externa que recibe información enviada por la unidad de código. Permite validar esta información. Solo puede existir máximo UN MOCK en una prueba, ya que simula un punto de salida y solo se valida un...