私はmyServiceそれを使用myOtherServiceして、リモート呼び出しを行い、promiseを返します。
angular.module('app.myService', ['app.myOtherService'])
  .factory('myService', [
    myOtherService,
    function(myOtherService) {
      function makeRemoteCall() {
        return myOtherService.makeRemoteCallReturningPromise();
      }
      return {
        makeRemoteCall: makeRemoteCall
      };      
    }
  ])
ユニットテストを作成するには、そのメソッドがpromiseを返すようmyServiceにモックする必要があります。これが私のやり方です:myOtherServicemakeRemoteCallReturningPromise
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()です。ただし、モックの値は、変更すると更新されません。
これを行う適切な方法は何ですか?
myService.makeRemoteCall()ですか?その場合、問題があるとmyService持っていないmakeRemoteCall、あなたの嘲笑を行うには、ないものをmyOtherService。