2012-03-01 26 views
112

Soy nuevo en Jasmine y acabo de empezar 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?Usar Jasmine para espiar una función sin un objeto

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

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

y probar con

expect(fakeElement.fakeMethod).toHaveBeenCalled(); 

Esto no funciona bien como el espía no funcionaba

Respuesta

126

Si está definiendo su función :

function test() {}; 

Entonces, esto es equivalente a:

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

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

Si eso no es, también debe ser capaz de:

test = jasmine.createSpy(); 

Si ninguno de los que están trabajando, algo más está pasando con su configuración.

No creo que su técnica 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.

+1

funcionó! Creo que el error que estaba cometiendo antes era que estaba llamando al método spyOn con método() en lugar de método. ¡Gracias! –

+2

Tuve algunos problemas al usar spyOn (ventana, 'prueba') usando chutzpah para ejecutar las pruebas como parte de nuestra automatización debido a que 'window' no se asignó. El uso de jasmine.createSpy() solucionó esto. – Henners

+5

jasmine.createSpy() funcionó perfectamente para mí. ¡Gracias! – dplass

36

Hay 2 alternativas que uso (por jazmín 2)

Éste no es bastante explícito, ya que parece que la función es en realidad una falsificación.

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

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

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

->jasmine source code para ver el segundo argumento

+0

Esto tiene un poco más de sentido y lo separa lo suficiente como para duplicar con éxito. +1 de mi parte Gracias, C§ – CSS

22

usuarios mecanografiado:

que sé OP preguntó sobre javascript, pero para cualquier usuario de TypeScript que encuentre esto que quiera espiar una función importada, aquí está wh en tu puedes hacer

En el archivo de prueba, convertir la importación de la función de esto:

import {foo} from '../foo_functions'; 

x = foo(y); 

A esto:

import * as FooFunctions from '../foo_functions'; 

x = FooFunctions.foo(y); 

Entonces se puede espiar a FooFunctions.foo :)

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

Gracias por la sugerencia de TypeScript. Debería ser igual para ES6/Babel, pero no lo he probado. – hgoebl

+0

Parece que solo funciona si llama a la función ** explícitamente con el alias FooFunctions **. Tengo una barra de función() que es una fábrica que devuelve baz() y quiero probar que baz() llama a foo(). Este método no parece funcionar en ese escenario. –

+1

Esto funcionará si el alias se toma dentro foo_functions 'const exportación FooFunctions = {bar, foo};' y la importación en la prueba se convierte en 'importación {} FooFunctions de' ../ foo_functions'.' Sin embargo , el alias aún debe ser utilizado explícitamente dentro de la implementación privada de foo_functions para que funcione el espía. 'const result = FooFunctions.foo (params)' // informes espía llamada 'const result = foo (params)' // espía informa que no hay llamada –

-1

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

var x = function() {} 

    spyX = spyOn(x, 'call') // 

    // something, that calls x 
    expect(spyX).toBeCalled() 
3

Una forma muy sencilla:

import * as myFunctionContainer from 'whatever-lib'; 

const fooSpy = spyOn(myFunctionContainer, 'myFunc'); 
Cuestiones relacionadas