javascript - tarjeta - whatsapp espia chat
Cómo espiar una propiedad de valor(en lugar de un método) con Jasmine (9)
¿Alguna razón por la que no puedes simplemente cambiarla en el objeto directamente? No es como si javascript impusiera visibilidad de una propiedad en un objeto.
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 a continuación:
spyOn(myObj, ''valueA'').andReturn(1);
expect(myObj.valueA).toBe(1);
En febrero de 2017, combinaron un RP que agregaba esta característica, lanzada en abril de 2017.
para espiar los getters / setters que usa: const spy = spyOnProperty(myObj, ''myGetterName'', ''get'');
donde myObj es su instancia, ''myGetterName'' es el nombre definido en su clase como get myGetterName() {}
y el tercer param 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 está interesado.
Respondiendo a la pregunta original, con jazmín 2.6.1, usted:
const spy = spyOnProperty(myObj, ''valueA'', ''get'').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
Estoy usando una grilla de kendo y, por lo tanto, no puedo cambiar la implementación a un método getter, pero quiero probar esto (burlar la grilla) y no probar la grilla en sí. Estaba usando un objeto espía pero esto no es compatible con la burla a la propiedad, así que hago esto:
this.$scope.ticketsGrid = {
showColumn: jasmine.createSpy(''showColumn''),
hideColumn: jasmine.createSpy(''hideColumn''),
select: jasmine.createSpy(''select''),
dataItem: jasmine.createSpy(''dataItem''),
_data: []
}
Es un poco largo pero funciona una delicia
Jasmine no tiene esa funcionalidad, pero es posible que puedas hackear 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);
La mejor forma es usar spyOnProperty
. Espera 3 propiedades y necesita pasar o set
como tercera propiedad.
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
del clientWidth
del objeto div.nativeElement
.
Llego un poco tarde a la fiesta aquí, lo sé, pero
Puede acceder directamente al objeto de llamadas, que puede proporcionarle las variables para cada llamada
expect(spy.calls.argsFor(0)[0].value).toBe(expectedValue)
No puede simular una variable, pero puede crear una función captadora para ella y simular ese método en su archivo de especificación.
Si está utilizando ES6 (Babel) o TypeScript, puede anular la propiedad utilizando get y set accessors.
export class SomeClassStub {
getValueA = jasmine.createSpy(''getValueA'');
setValueA = jasmine.createSpy(''setValueA'');
get valueA() { return this.getValueA(); }
set valueA(value) { this.setValueA(value); }
}
Luego, en su prueba, puede verificar que la propiedad esté configurada con:
stub.valueA = ''foo'';
expect(stub.setValueA).toHaveBeenCalledWith(''foo'');
Supongamos que hay un método como este que necesita pruebas. La propiedad src
de la imagen diminuta necesita verificación.
function reportABCEvent(cat, type, val) {
var i1 = new Image(1, 1);
var link = getABC(''creosote'');
link += "&category=" + String(cat);
link += "&event_type=" + String(type);
link += "&event_value=" + String(val);
i1.src = link;
}
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 un alcance para ser visible en el código falso en el SpyOn y también más tarde después de que se llame al "reportABCEvent"
describe("Alphabetic.ads", function() {
it("ABC events create an image request", function() {
var hook={};
spyOn(window, ''Image'').andCallFake( function(x,y) {
hook={ src: {} }
return hook;
}
);
reportABCEvent(''testa'', ''testb'', ''testc'');
expect(hook.src).
toEqual(''[zubzub]&arg1=testa&arg2=testb&event_value=testc'');
});
Esto es para jazmín 1.3 pero podría funcionar en 2.0 si el "andCallFake" se altera al nombre 2.0