Al realizar pruebas unitarias en una fábrica Angular (con Karma + Jasmine), ¿cómo inyecto una dependencia de stub 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.
angularjs
jasmine
karma-runner
Roy Truelove
fuente
fuente
var theFactory; beforeEach(inject(function(myFactory) { theFactory = myFactory; } )));
luego úselotheFactory
en su prueba.El comentario de @bentsai es realmente muy útil para probar servicios; para completar, estoy agregando un ejemplo.
Aquí hay una prueba
jasmine
que hace aproximadamente lo que estás buscando. Nota: esto requiere que hayasangular-mocks
incluido (esto es lo que proporciona funciones comomodule
yinject
).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 código auxiliar de cómo podrían verse 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 le
inject()
permite incorporar dependencias, tal como lo esperaría en su aplicación angular normal, y como tal, puede crear requisitos para respaldar las pruebas de cosas que dependen de ellas.fuente