spyon pokemon create javascript unit-testing jasmine

javascript - pokemon - spyon jest



Usando Jasmines Spyon sobre un método privado. (5)

¿Es posible usar el método spyon del framework de prueba de unidades Jasmine en una clase de métodos privados?

La documentación proporciona este ejemplo, pero ¿puede ser flexible para una función privada?

describe("Person", function() { it("calls the sayHello() function", function() { var fakePerson = new Person(); spyOn(fakePerson, "sayHello"); fakePerson.helloSomeone("world"); expect(fakePerson.sayHello).toHaveBeenCalled(); }); });

Gracias por adelantado


No porque no pueda acceder a una función privada fuera del contexto de su instancia.

Por cierto, no es una buena idea espiar objetos que quieras probar. Cuando se prueba si se llama a un método específico en su clase que desea probar, no dice nada. Digamos que escribiste la prueba y la pasaste, dos semanas después refactorizas algunas cosas en la función y agregas un error. Entonces tu prueba sigue siendo verde porque te llama la función. segundo

Los espías son útiles cuando trabajas con inyección de dependencias , donde todas las dependencias externas son pasadas por el constructor y no se crean en tu clase. Así que digamos que tienes una clase que necesita un elemento dom. Normalmente, usaría un selector de jquery en la clase para obtener este elemento. Pero, ¿cómo quieres probar que algo se hace con ese elemento? Claro que puedes agregarlo a tus páginas de pruebas html. Pero también puedes llamar a tu clase pasando el elemento en el constructor. Al hacerlo, puede usar el espía para verificar si su clase interactúa con ese elemento como esperaba.


Si desea probar funciones privadas dentro de una clase, ¿por qué no agregar un constructor a su clase que indique que esas funciones privadas son devueltas?

Lea esto para ver lo que quiero decir: http://iainjmitchell.com/blog/?p=255

¡He estado usando una idea similar y hasta ahora está funcionando muy bien!


Si usa Typescript para sus objetos, la función no es realmente privada.
Todo lo que necesita es guardar el valor que devuelve la llamada de spyOn y luego consultar su propiedad de calls .

Al final, este código debería funcionar bien para ti (al menos funcionó para mí):

describe("Person", function() { it("calls the sayHello() function", function() { var fakePerson = new Person(); // save the return value: var spiedFunction = spyOn(fakePerson, "sayHello"); fakePerson.helloSomeone("world"); // query the calls property: expect(spiedFunction.calls.any()).toBeFalsy(); }); });


Simplemente agregue un parámetro genérico <cualquiera> a la función spyon () :

spyOn<any>(fakePerson, ''sayHello'');

¡Funciona perfectamente!


Typescript se compila a javascript y en javascript todos los métodos son públicos. Por lo tanto, puede usar la notación de índice de matriz para acceder a métodos privados o archivos, a saber:

Object[''private_field'']

Para más información, visite el siguiente blog.