首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在没有AngularJS强制摘要的情况下,如何解决AngularJS、Jasmin2.0中的承诺?

在没有AngularJS强制摘要的情况下,如何解决AngularJS、Jasmin2.0中的承诺?
EN

Stack Overflow用户
提问于 2014-06-03 17:07:57
回答 4查看 27.1K关注 0票数 48

这似乎是对$scope.$digest()的承诺。这是愚蠢的海事组织,但很好,我有工作,在适当的地方(控制器)。

现在我所处的情况是,我有一个服务,它可以不关心应用程序中的任何作用域,它所做的只是从服务器返回一些数据,但是这个承诺似乎并没有得到解决。

代码语言:javascript
运行
复制
app.service('myService', function($q) {
  return {
    getSomething: function() {
      var deferred = $q.defer();
      deferred.resolve('test');
      return deferred.promise;
    }
  }
});

代码语言:javascript
运行
复制
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();
    });
  });
});

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

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

代码语言:javascript
运行
复制
  it('should get something', function($rootScope, done) {
    var promise = myService.getSomething();

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

    $rootScope.$digest();
    done();
  }); 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-03 17:11:24

您需要在测试中注入$rootScope并在其上触发$digest

票数 42
EN

Stack Overflow用户

发布于 2014-06-03 17:10:55

总是有$rootScope,使用它

代码语言:javascript
运行
复制
inject(function($rootScope){
myRootScope=$rootScope;
})
....

myRootScope.$digest();
票数 12
EN

Stack Overflow用户

发布于 2015-06-15 01:17:31

所以我整个下午都在为这件事而挣扎。读了这篇文章后,我也觉得答案有些不妥,原来是这样的。上述任何一个答案都没有给出一个明确的解释,在哪里和为什么使用$rootScope.$digest。这就是我想出来的。

首先为什么?当您从非角度事件或回调响应时,您需要使用$rootScope.$digest。这将包括纯DOM事件、jQuery事件和其他第三方承诺库,而不是$q的一部分。

第二,在哪里?在你的代码里,而不是你的测试中。没有必要将$rootScope注入到测试中,它只需要在实际的角度服务中使用。这就是上面所有的内容都无法说明答案的地方,它们显示$rootScope.$digest是从测试中调用的。

我希望这能帮助下一个长时间有同样问题的人。

更新

昨天被否决后,我删除了这篇文章。今天,我继续有这个问题,试图使用上述的答案,慷慨提供。因此,我以声誉点为代价来准备我的答案,因此,我要删除它。

--这是您在非角度事件处理程序中所需要的,您正在使用$q并尝试使用Jasmin.进行测试。

代码语言:javascript
运行
复制
something.on('ready', function(err) {
    $rootScope.$apply(function(){deferred.resolve()});              
});

注意,在某些情况下,它可能需要包装在$timeout中。

代码语言:javascript
运行
复制
something.on('ready', function(err) {
    $timeout(function(){
      $rootScope.$apply(function(){deferred.resolve()});    
    });     
});

再来一个音符。在最初的问题示例中,您在错误的时间调用了done。您需要在承诺的donethen方法(或catchfinally)中调用它,然后再进行解析。在承诺解决之前调用它,这将导致it子句终止。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24021031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档