J'ai myServicecette utilisation myOtherService, qui fait un appel à distance, promesse de retour:
angular.module('app.myService', ['app.myOtherService'])
  .factory('myService', [
    myOtherService,
    function(myOtherService) {
      function makeRemoteCall() {
        return myOtherService.makeRemoteCallReturningPromise();
      }
      return {
        makeRemoteCall: makeRemoteCall
      };      
    }
  ])Pour faire un test unitaire, myServiceje dois me moquer myOtherService, de sorte que sa makeRemoteCallReturningPromiseméthode renvoie une promesse. Voici comment je fais:
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');
      });    
  }));  Comme vous pouvez le voir ci-dessus, la définition de ma maquette dépend de $qce que je dois charger en utilisant inject(). De plus, l'injection du simulacre devrait se produire module(), ce qui devrait arriver avant inject(). Cependant, la valeur de la maquette n'est pas mise à jour une fois que je la modifie.
Quelle est la bonne façon de procéder?
myService.makeRemoteCall()? Si c'est le cas, le problème est demyServicene pas avoir lemakeRemoteCall, rien à voir avec votre moqueurmyOtherService.