Solución:
Técnicamente, en las versiones actuales de TypeScript, los métodos privados solo se comprueban en tiempo de compilación para que sean privados, por lo que puede llamarlos.
class Example {
public publicMethod() {
return 'public';
}
private privateMethod() {
return 'private';
}
}
const example = new Example();
console.log(example.publicMethod()); // 'public'
console.log(example.privateMethod()); // 'private'
Menciono esto solamente porque preguntaste cómo hacerlo, y así es como podría hazlo.
Respuesta correcta
Sin embargo, ese método privado debe ser llamado por algún otro método … de lo contrario, no se llama en absoluto. Si prueba el comportamiento de ese otro método, cubrirá el método privado en el contexto en el que se utiliza.
Si prueba específicamente métodos privados, sus pruebas se acoplarán estrechamente a los detalles de la implementación (es decir, no sería necesario cambiar una buena prueba si refactorizara la implementación).
Descargo de responsabilidad
Si aún prueba en el nivel del método privado, el compilador podría en el futuro, cambie y haga que la prueba falle (es decir, si el compilador convirtió el método en privado “correctamente”, o si una versión futura de ECMAScript agregó palabras clave de visibilidad, etc.).
Una posible solución para omitir las comprobaciones de TypeScript es acceder a la propiedad dinámicamente (sin decir si es bueno).
myClass['privateProp']
o por métodos: myClass['privateMethod']()
En mi caso, utilizo el prototipo del objeto para acceder a un método privado. Funciona bien y TS no jura.
Por ejemplo:
class Example {
private privateMethod() {}
}
describe() {
it('test', () => {
const example = new Example();
const exampleProto = Object.getPrototypeOf(example);
exampleProto.privateMethod();
})
}
Si usa un método estático, use exampleProto.constructor.privateMethod();
.