javascript - Prueba de Angular function.bind()
Estoy teniendo un momento difícil tratando de probar si alguna función está vinculada a un componente después de que el componente ha sido inicializado.
Esta es mi función ngOnInit():
ngOnInit() {
this.someFunction = this.someFunction.bind(this);
}
Y esta es la función que quiero vincular al componente:
someFunction() {
// this empty function is not called yet but should be bound to the component
}
Y este es mi antes de cada:
beforeEach(async(() => {
fixture = TestBed.createComponent(ComponentName);
component = fixture.componentInstance;
fixture.detectChanges();
}));
Y esta es mi función de describir:
describe('ngOnInit', () => {
it('someFunction has been bound to the component.', () => {
let bindFunctionSpy = spyOn(component.someFunction, 'bind').and.callThrough();
component.ngOnInit();
expect(bindFunctionSpy).toHaveBeenCalledWith(component);
});
});
El problema que estoy enfrentando aquí es que hay un error de TypeScript en la función spyOn que me impide compilar los casos de prueba, dice:
error TS2345: El argumento de tipo '"bind"' no se puede asignar al parámetro de tipo 'never'.
Entonces, ¿qué es exactamente lo que no estoy haciendo bien aquí?
Lo mismo ocurre si intento espiar cualquiera de las funciones del prototipo de una función de componente como apply o call, por ejemplo.
¡Sin embargo, si trato de espiar una función prototipo de una variable de componente como length o toLowerCase, no lanza tal error!
Otra cosa a notar es que esta prueba en realidad a veces se compila con éxito y de hecho pasa, y a veces lanza el error al compilar, pero sucede solo cuando hago algún cambio aleatorio como agregar un espacio y luego guardarlo para que Karma pueda detectar que ocurrió un cambio y recompilar las pruebas, pero si cierro la terminal y luego la inicio de nuevo y ejecuto ng test, obtengo el error otra vez.
Respuesta #1
La mejor manera de hacer esto es simplemente convirtiendo tu función al tipo CallableFunction.
let bindFunctionSpy = spyOn(component.someFunction as CallableFunction, 'bind').and.callThrough();
Respuesta #2
Podrías intentar
let bindFunctionSpy = spyOn(component.someFunction.prototype, 'bind').and.callThrough();
