Respuestas:
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.
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();
¿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.
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á mejor
spyOn
.
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.
spyOn(myObj, 'getValueA').andReturn(1);
expect(myObj.getValueA()).toBe(1);
and.returnValue(1)
La mejor forma es utilizar spyOnProperty
. Espera 3 parámetros y debe pasar get
o set
como tercer parámetro .
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 fijando la get
de clientWidth
del div.nativeElement
objeto.
Si está utilizando ES6 (Babel) o TypeScript, puede eliminar la propiedad utilizando los accesos get y set
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');
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.
const spy = spyOnProperty(myObj, 'valueA').and.returnValue(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
Supongamos que hay un método como este que necesita ser probado. La src
propiedad de la imagen diminuta necesita ser revisada.
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 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"
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 jasmine 1.3 pero podría funcionar en 2.0 si "andCallFake" se modifica por el nombre 2.0
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:
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 de maravilla
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
expect(spy.calls.argsFor(0)[0].value).toBe(expectedValue)
valueA
es unObservable
oSubject
? Estoy recibiendoProperty valueA does not have access type get