practicas practica patrones node limpio diseño codigo buenas javascript unit-testing jasmine

practica - patrones de diseño javascript



Usar Jasmine para espiar una función sin un objeto (5)

Hay 2 alternativas que utilizo (para jazmín 2)

Este no es muy explícito porque parece que la función es realmente falsa.

test = createSpy().and.callFake(test);

El segundo más detallado, más explícito y más "limpio":

test = createSpy(''testSpy'', test).and.callThrough();

-> código fuente de jazmín para ver el segundo argumento

Soy nuevo con Jasmine y recién comencé a usarlo. Tengo un archivo js de biblioteca con muchas funciones que no están asociadas a ningún objeto (es decir, son globales). ¿Cómo hago para espiar estas funciones?

Intenté usar ventana / documento como el objeto, pero el espía no funcionó aunque se llamó a la función. También traté de envolverlo en un objeto falso de la siguiente manera:

var fakeElement = {}; fakeElement.fakeMethod = myFunctionName; spyOn(fakeElement, "fakeMethod");

y prueba con

expect(fakeElement.fakeMethod).toHaveBeenCalled();

Esto tampoco funciona ya que el espía no funcionó


Si estás definiendo tu función:

function test() {};

Entonces, esto es equivalente a:

window.test = function() {} /* (in the browser) */

Entonces spyOn(window, ''test'') debería funcionar.

Si eso no es así, también debería ser capaz de:

test = jasmine.createSpy();

Si ninguno de ellos está funcionando, está sucediendo algo más con su configuración.

No creo que tu técnica de fakeElement funcione debido a lo que está sucediendo detrás de escena. El método global original todavía apunta al mismo código. Lo que hace el espionaje es el proxy, pero solo en el contexto de un objeto. Si puedes obtener tu código de prueba para llamar a través del fakeElement, funcionaría, pero luego podrías renunciar a los fns globales.


Una forma muy simple:

import * as myFunctionContainer from ''whatever-lib''; const fooSpy = spyOn(myFunctionContainer, ''myFunc'');


debe ser posible sin definir ventana. función global. Tratar:

var x = function() {} spyX = spyOn(x, ''call'') // // something, that calls x expect(spyX).toBeCalled()


Usuarios de TypeScript:

Sé que OP preguntó acerca de javascript, pero para los usuarios de TypeScript que se cruzan con esto y quieren espiar una función importada, esto es lo que puedes hacer.

En el archivo de prueba, convierta la importación de la función a partir de esto:

import {foo} from ''../foo_functions''; x = foo(y);

A esto:

import * as FooFunctions from ''../foo_functions''; x = FooFunctions.foo(y);

Entonces puedes espiar a FooFunctions.foo :)

spyOn(FooFunctions, ''foo'').and.callFake(...); // ... expect(FooFunctions.foo).toHaveBeenCalled();