# - Stub -

[Doble de prueba](https://blog.cincuentapalabras.co/doble-de-prueba) usado para simular una dependencia externa que **envía** información hacia la [unidad de código](https://blog.cincuentapalabras.co/unidad-de-codigo).

Permite controlar a nuestro antojo la información recibida por la [unidad de código](https://blog.cincuentapalabras.co/unidad-de-codigo).

Pueden existir varios Stub en una [prueba](https://blog.cincuentapalabras.co/prueba-unitaria).

Ya que inserta información a la [prueba](https://blog.cincuentapalabras.co/prueba-unitaria) NO SE HACEN VALIDACIONES SOBRE STUBS.

```ts
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](https://blog.fiftywords.co/stub)
