我有myService使用myOtherService,它进行远程调用,返回Promise:
angular.module('app.myService', ['app.myOtherService'])
  .factory('myService', [
    myOtherService,
    function(myOtherService) {
      function makeRemoteCall() {
        return myOtherService.makeRemoteCallReturningPromise();
      }
      return {
        makeRemoteCall: makeRemoteCall
      };      
    }
  ])
为了对myService我进行单元测试,我需要模拟myOtherService,这样它的makeRemoteCallReturningPromise方法就会返回一个Promise。这就是我的做法:
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');
      });    
  }));  
从上面可以看出,我的模拟的定义取决于$q,我必须使用inject(). 此外,注入模拟应该发生在module(),应该在 之前发生inject()。但是,一旦我更改它,模拟的值就不会更新。
这样做的正确方法是什么?