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:
- Use
$provide
y un módulo anónimo para inyectar el simulacro. - 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();
}));
});