unit tests test run karma e2e angularjs jasmine karma-runner

tests - Unit testing AngularJS fábricas que tienen dependencias



testing in angular 4 (2)

Cuando la unidad prueba una fábrica Angular (con Karma + Jasmine), ¿cómo inyecto una dependencia de trozo en la fábrica bajo prueba?

Aquí está mi fábrica:

mod = angular.module(''myFactoryMod'', []); mod.factory(''myFactory'', [ ''$log'', ''oneOfMyOtherServices'', function($log, svc) { return makeSomethingThatDoesSomethingWithTheseDependencies($log, svc); } ]);

oneOfMyOtherServices es necesario al crear una instancia de mi fábrica.

Aquí está mi prueba:

it(''can get an instance of my factory'', function() { var oneOfMyOtherServicesStub; angular.mock.module(''myFactoryMod''); oneOfMyOtherServicesStub = { someVariable: 1 }; //****How do I get my stub in my target? **** angular.mock.inject([''myFactory'', function(target) { expect(target).toBeDefined(); } ]); })

NB Sé que $controller permite esto para los controladores, pero no veo un equivalente para las fábricas.


El comentario de @bentsai es realmente muy útil para los servicios de prueba; para completar, estoy agregando un ejemplo.

Aquí hay una prueba de jasmine que hace aproximadamente lo que estás buscando. Nota: esto requiere que tenga angular-mocks incluidas (esto es lo que proporciona funciones como module e inject ).

describe(''app: myApp'', function() { beforeEach(module(''myApp'')); var $controller; beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); // Factory of interest is called MyFactory describe(''factory: MyFactory'', function() { var factory = null; beforeEach(inject(function(MyFactory) { factory = MyFactory; })) it(''Should define methods'', function() { expect(factory.beAwesome).toBeDefined() expect(factory.beAwesome).toEqual(jasmine.any(Function)) }); }); });

Este es un resumen de lo que podría ser el módulo y la definición de fábrica asociada:

var app = angular.module(''myApp'', []); app.factory(''MyFactory'', function() { var factory = {}; factory.beAwesome = function() { return ''Awesome!''; } return factory; });

En este caso, está claro que el uso de inject() permite establecer dependencias, tal como cabría esperar en su aplicación angular normal, y como tal puede crear requisitos para respaldar las pruebas que dependen de ellos.


Hay dos formas de lograr algo como esto que yo sepa:

  1. Use $provide y un módulo anónimo para inyectar el simulacro.
  2. Inyecta el servicio que te gustaría burlar y utiliza la capacidad de espionaje de jazmín para proporcionar valores simulados.

La segunda opción solo funciona si sabe exactamente qué métodos su código bajo prueba llamará al servicio inyectado y puede burlarlos fácilmente. Como parece que está accediendo a una propiedad de datos en el servicio (en lugar de a un método), es mejor buscar la primera opción.

Usar $provide sería más o menos así:

describe(''myFactory'', function () { // Load your module. beforeEach(module(''myFactoryMod'')); // Setup the mock service in an anonymous module. beforeEach(module(function ($provide) { $provide.value(''oneOfMyOtherServicesStub'', { someVariable: 1 }); })); it(''can get an instance of my factory'', inject(function(myFactory) { expect(myFactory).toBeDefined(); })); });