En febrero de 2017, fusionaron un PR agregando esta función, que lanzaron en abril de 2017.
así que para espiar los getters / setters que usa:
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
donde myObj es su instancia, 'myGetterName' es el nombre del que está definido en su clase como get myGetterName() {}
y el tercer parámetro es el tipo get
o set
.
Puede usar las mismas afirmaciones que ya usa 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 está interesado.
https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199
Respondiendo a la pregunta original, con jazmín 2.6.1, haría lo siguiente:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
valueA
es unObservable
oSubject
? Estoy recibiendoProperty valueA does not have access type get
¿Alguna razón por la que no puede cambiarlo directamente en el objeto? No es como si JavaScript imponga la visibilidad de una propiedad en un objeto.
fuente
spyOn
indica explícitamente que quiero simular algo, mientras que establezco directamente la propiedad indica implícitamente que quiero simular algo, y no estoy seguro de que alguien más entienda que me estoy burlando de algo cuando él está leyendo el código. El otro caso es que no quiero cambiar el comportamiento interno del objeto, por ejemplo, si cambio la propiedad de longitud de una matriz, la matriz se recorta, por lo que una simulación será mejorspyOn
.spyOn
no pasa la prueba si la propiedad no existe.TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
Jasmine no tiene esa funcionalidad, pero es posible que puedas hackear algo juntos usando
Object.defineProperty
.Puede refactorizar su código para usar una función de captador, luego espiar el captador.
fuente
and.returnValue(1)
La mejor forma es utilizar
spyOnProperty
. Espera 3 parámetros y debe pasarget
oset
como tercer parámetro .Ejemplo
Aquí estoy fijando la
get
declientWidth
deldiv.nativeElement
objeto.fuente
Si está utilizando ES6 (Babel) o TypeScript, puede eliminar la propiedad utilizando los accesos get y set
Luego, en su prueba, puede verificar que la propiedad esté configurada con:
fuente
La forma correcta de hacer esto es con la propiedad de espiar, que le permitirá simular una propiedad en un objeto con un valor específico.
fuente
Supongamos que hay un método como este que necesita ser probado. La
src
propiedad de la imagen diminuta necesita ser revisada.El spyOn () a continuación hace que la "nueva imagen" se alimente con el código falso de la prueba. El código spyOn devuelve un objeto que solo tiene una propiedad src.
Como la variable "gancho" tiene como alcance para ser visible en el código falso en el SpyOn y también más adelante después de que se llama "reportABCEvent"
Esto es para jasmine 1.3 pero podría funcionar en 2.0 si "andCallFake" se modifica por el nombre 2.0
fuente
Estoy usando una cuadrícula de kendo y, por lo tanto, no puedo cambiar la implementación a un método getter, pero quiero probar esto (burlándome de la cuadrícula) y no probar la cuadrícula en sí. Estaba usando un objeto espía pero esto no es compatible con la burla de propiedad, así que hago esto:
Es un poco largo pero funciona de maravilla
fuente
Llego un poco tarde a la fiesta, lo sé, pero
Puede acceder directamente al objeto de llamadas, que puede proporcionarle las variables para cada llamada
fuente
No puede simular la variable, pero puede crear una función getter para ella y simular ese método en su archivo de especificaciones.
fuente