javascript - test - ¿Hay alguna forma de verificar el orden de las ejecuciones de espías con Jasmine?
karma js (2)
Hasta ahora lo he estado haciendo de la siguiente manera, pero parece incómodo y no se escalará bien:
obj.spy1.andCallFake(function() {
expect(obj.spy2.calls.length).toBe(0);
});
Tengo dos objetos que han sido configurados como espías con Jasmine:
spyOn(obj, ''spy1'');
spyOn(obj, ''spy2'');
Necesito verificar que las llamadas a spy1
preceden a las llamadas a spy2
. Puedo verificar si se llaman a los dos:
expect(obj.spy1).toHaveBeenCalled();
expect(obj.spy2).toHaveBeenCalled();
pero esto pasará incluso si se llamó primero a obj.spy2()
. ¿Hay una forma fácil de verificar que se llamó uno antes que el otro?
Otra alternativa es mantener una lista de llamadas:
var objCallOrder;
beforeEach(function() {
// Reset the list before each test
objCallOrder = [];
// Append the method name to the call list
obj.spy1.and.callFake(function() { objCallOrder.push(''spy1''); });
obj.spy2.and.callFake(function() { objCallOrder.push(''spy2''); });
});
Lo que le permite verificar el orden de diferentes formas:
Compare directamente a la lista de llamadas:
it(''calls exactly spy1 then spy2'', function() {
obj.spy1();
obj.spy2();
expect(objCallOrder).toEqual([''spy1'', ''spy2'']);
});
Verifique el orden relativo de algunas de las llamadas:
it(''calls spy2 sometime after calling spy1'', function() {
obj.spy1();
obj.spy3();
obj.spy4();
obj.spy2();
expect(obj.spy1).toHaveBeenCalled();
expect(obj.spy2).toHaveBeenCalled();
expect(objCallOrder.indexOf(''spy1'')).toBeLessThan(objCallOrder.indexOf(''spy2''));
});