(Hay una pregunta relacionada aquí: la prueba Jasmine no ve el módulo AngularJS )
Solo quiero probar un servicio sin iniciar Angular.
He visto algunos ejemplos y el tutorial, pero no me voy a ninguna parte.
Solo tengo tres archivos:
myService.js: donde defino un servicio AngularJS
test_myService.js: donde defino una prueba de Jasmine para el servicio.
specRunner.html: un archivo HTML con la configuración normal de jazmín y donde importo los otros dos archivos anteriores y Jasmine, Angularjs y angular-mocks.js.
Este es el código para el servicio (que funciona como se esperaba cuando no estoy probando):
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
Como estoy tratando de probar el servicio de forma aislada, debería poder acceder a él y verificar sus métodos. Mi pregunta es: ¿cómo puedo inyectar el servicio en mi prueba sin iniciar AngularJS?
Por ejemplo, ¿cómo puedo probar el valor devuelto para un método del servicio con Jasmine como este?
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
beforeEach
en el caso de que sean necesarias muchas ... muchas ... muchas pruebas para el servicio? Probando un modelo de datos (servicio) y contiene un montón de variables globales. Gracias, C§Si bien la respuesta anterior probablemente funcione bien (no la he probado :)), a menudo tengo muchas más pruebas para ejecutar, así que no inyecto en las pruebas. Agruparé () los casos en bloques de descripción y ejecutaré mi inyección en un beforeEach () o beforeAll () en cada bloque de descripción.
Robert también tiene razón en que dice que debe usar el inyector Angular $ para que las pruebas conozcan el servicio o la fábrica. Angular también usa este inyector en sus aplicaciones para decirle a la aplicación qué está disponible. Sin embargo, se puede llamar en más de un lugar y también se puede llamar implícitamente en lugar de explícitamente. Notará que en mi archivo de prueba de especificaciones de ejemplo a continuación, el bloque beforeEach () llama implícitamente al inyector para que las cosas estén disponibles para ser asignadas dentro de las pruebas.
Volviendo a agrupar cosas y usar bloques anteriores, aquí hay un pequeño ejemplo. Estoy creando un Servicio Cat y quiero probarlo, por lo que mi configuración simple para escribir y probar el Servicio se vería así:
app.js
Especificaciones: Controlador de gatos
Especificaciones: Servicio de gatos
EDITAR Basado en algunos de los comentarios, he actualizado mi respuesta para que sea un poco más compleja, y también he creado un Plunkr demostrando pruebas unitarias. Específicamente, uno de los comentarios mencionó "¿Qué pasa si el Servicio de un controlador tiene en sí mismo una dependencia simple, como $ log?" - que se incluye en el ejemplo con casos de prueba. ¡Espero eso ayude! ¡Prueba o piratea el planeta!
https://embed.plnkr.co/aSPHnr/
fuente
Necesitaba probar una directiva que requería otra directiva, Google Places Autocomplete , estaba debatiendo si debería simplemente burlarme de ella ... de todos modos esto funcionó sin arrojar ningún error para la directiva que requería gPlacesAutocomplete.
fuente
Si desea probar un controlador, puede inyectarlo y probarlo como se muestra a continuación.
fuente