Skip to main content

Command Palette

Search for a command to run...

- Stub -

Updated
2 min readView as Markdown
- 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