Tengo myServiceese uso myOtherService, que hace una llamada remota, devolviendo la promesa:
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [
myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
Para hacer una prueba unitaria myService, necesito burlarme myOtherService, de modo que su makeRemoteCallReturningPromisemétodo devuelva una promesa. Así es como lo hago:
describe('Testing remote call returning promise', function() {
var myService;
var myOtherServiceMock = {};
beforeEach(module('app.myService'));
// I have to inject mock when calling module(),
// and module() should come before any inject()
beforeEach(module(function ($provide) {
$provide.value('myOtherService', myOtherServiceMock);
}));
// However, in order to properly construct my mock
// I need $q, which can give me a promise
beforeEach(inject(function(_myService_, $q){
myService = _myService_;
myOtherServiceMock = {
makeRemoteCallReturningPromise: function() {
var deferred = $q.defer();
deferred.resolve('Remote call result');
return deferred.promise;
}
};
}
// Here the value of myOtherServiceMock is not
// updated, and it is still {}
it('can do remote call', inject(function() {
myService.makeRemoteCall() // Error: makeRemoteCall() is not defined on {}
.then(function() {
console.log('Success');
});
}));
Como puede ver en lo anterior, la definición de mi simulacro depende de $qqué debo cargar usando inject(). Además, inyectar el simulacro debería estar sucediendo en module(), lo que debería venir antes inject(). Sin embargo, el valor del simulacro no se actualiza una vez que lo cambio.
¿Cuál es la forma apropiada de hacer esto?
myService.makeRemoteCall()? Si es así, el problema esmyServiceno tenermakeRemoteCallnada que ver con su burlamyOtherService.