- 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 */






