Ho myServiceche usi myOtherService, che effettua una chiamata remota, restituendo promessa:
angular.module('app.myService', ['app.myOtherService'])
.factory('myService', [
myOtherService,
function(myOtherService) {
function makeRemoteCall() {
return myOtherService.makeRemoteCallReturningPromise();
}
return {
makeRemoteCall: makeRemoteCall
};
}
])
Per fare un test di unità per il myServiceHo bisogno di prendere in giro myOtherService, in modo tale che il suo makeRemoteCallReturningPromisemetodo restituisce una promessa. Ecco come lo faccio:
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');
});
}));
Come puoi vedere da quanto sopra, la definizione del mio mock dipende da $q, che devo caricare usando inject(). Inoltre, l'iniezione del finto dovrebbe avvenire in module(), che dovrebbe venire prima inject(). Tuttavia, il valore per il mock non viene aggiornato dopo averlo modificato.
Qual è il modo corretto per farlo?
myService.makeRemoteCall()? In tal caso, il problema èmyServicenon avere ilmakeRemoteCall, niente a che fare con il tuo derisomyOtherService.