Búsqueda de sitios web

javascript - Cómo espiar una propiedad de valor (en lugar de un método) con Jasmine


El spyOn de Jasmine es bueno para cambiar el comportamiento de un método, pero ¿hay alguna manera de cambiar una propiedad de valor (en lugar de un método) para un objeto? el código podría ser como el siguiente:

spyOn(myObj, 'valueA').andReturn(1);
expect(myObj.valueA).toBe(1);

Respuesta #1

En febrero de 2017, fusionaron un PR que añadía esta función, lo lanzaron en abril de 2017.

así que para espiar getters/setters usas: const spy=spyOnProperty(myObj, 'myGetterName', 'get'); donde myObj es tu instancia, 'myGetterName' es el nombre de ese definido en tu clase como get myGetterName() {} y el tercer parámetro es el tipo get o set.

Puedes usar las mismas afirmaciones que ya usas con los espías creados con spyOn.

Entonces puedes, por ejemplo:

const spy = spyOnProperty(myObj, 'myGetterName', 'get'); // to stub and return nothing. Just spy and stub.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.returnValue(1); // to stub and return 1 or any value as needed.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.callThrough(); // Call the real thing.

Aquí está la línea en el código fuente de GitHub donde este método está disponible si te interesa.

https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199

Y el método spyOnProperty está aquí

Respondiendo a la pregunta original, con jasmine 2.6.1, usted:

const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();

Respuesta #2

¿Alguna razón por la que no puedas simplemente cambiarlo directamente en el objeto? No es como si JavaScript impusiera la visibilidad de una propiedad en un objeto.

Respuesta #3

La mejor manera es usar spyOnProperty. Espera 3 parámetros y necesitas pasar get o set como tercer parámetro.

Ejemplo

const div = fixture.debugElement.query(By.css('.ellipsis-overflow'));
// now mock properties
spyOnProperty(div.nativeElement, 'clientWidth', 'get').and.returnValue(1400);
spyOnProperty(div.nativeElement, 'scrollWidth', 'get').and.returnValue(2400);

Aquí estoy configurando el get de clientWidth del objeto div.nativeElement.

Respuesta #4

Jasmine no tiene esa funcionalidad, pero podrías ser capaz de improvisar algo usando Object.defineProperty.

Podrías refactorizar tu código para usar una función getter, y luego espiar el getter.

spyOn(myObj, 'getValueA').andReturn(1);
expect(myObj.getValueA()).toBe(1);

Artículos relacionados