如果没有$ scope强制摘要,如何解决AngularJS,Jasmine 2.0中的promise?

Ter*_*rry 47 jasmine angularjs karma-runner karma-jasmine

似乎承诺不会在Angular/Jasmine测试中解决,除非你强迫一个$scope.$digest().这是愚蠢的IMO,但很好,我有适用的工作(控制器).

我现在是这种情况是我有一个并不十分关心应用程序中的任何一个范围的服务,它的作用是从服务器返回的一些数据,但承诺似乎并没有被解决.

app.service('myService', function($q) {
  return {
    getSomething: function() {
      var deferred = $q.defer();
      deferred.resolve('test');
      return deferred.promise;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
describe('Method: getSomething', function() {
  // In this case the expect()s are never executed
  it('should get something', function(done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
      expect(1).toEqual(2);
    });

    done();
  });

  // This throws an error because done() is never called.
  // Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
  it('should get something', function(done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
      expect(1).toEqual(2);
      done();
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

测试此功能的正确方法是什么?

编辑:解决方案供参考.显然,即使服务没有使用它,你也不得不注入和消化$ rootScope.

  it('should get something', function($rootScope, done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
    });

    $rootScope.$digest();
    done();
  }); 
Run Code Online (Sandbox Code Playgroud)

pko*_*rce 41

你需要注入$rootScope你的测试并触发$digest它.

  • 好吧,问题是当前的promises实现与摘要周期有关(实际上要解决这个问题是非常重要的,因为我们在浏览器中没有等效的`nextTick`方法).所以是的,我担心只要传播承诺结果与AngularJS中的$ digest循环相关联,它就是你唯一的选择. (6认同)
  • 我尝试了这个,但现在得到了"不再需要请求"的错误. (4认同)
  • 它有效,但似乎有点荒谬,我希望有另一种选择.我想这对Angular团队来说是一个问题. (2认同)

mpm*_*mpm 12

总是有$ rootScope,使用它

inject(function($rootScope){
myRootScope=$rootScope;
})
....

myRootScope.$digest();
Run Code Online (Sandbox Code Playgroud)