Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当没有$scope强制摘要时,如何解决AngularJS、Jasmine 2.0中的承诺?_Angularjs_Jasmine_Karma Runner_Karma Jasmine - Fatal编程技术网

当没有$scope强制摘要时,如何解决AngularJS、Jasmine 2.0中的承诺?

当没有$scope强制摘要时,如何解决AngularJS、Jasmine 2.0中的承诺?,angularjs,jasmine,karma-runner,karma-jasmine,Angularjs,Jasmine,Karma Runner,Karma Jasmine,这似乎是一种承诺。这是愚蠢的,但很好,我有工作在适用的地方(控制器) 我现在所处的情况是,我有一个服务,它可能不太关心应用程序中的任何作用域,它所做的只是从服务器返回一些数据,但承诺似乎没有得到解决 app.service('myService', function($q) { return { getSomething: function() { var deferred = $q.defer(); deferred.resolve('test');

这似乎是一种承诺。这是愚蠢的,但很好,我有工作在适用的地方(控制器)

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

app.service('myService', function($q) {
  return {
    getSomething: function() {
      var deferred = $q.defer();
      deferred.resolve('test');
      return deferred.promise;
    }
  }
});

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

编辑:供参考的解决方案。显然,即使服务未使用$rootScope,您也必须注入并消化它。

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

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

    $rootScope.$digest();
    done();
  }); 
something.on('ready', function(err) {
    $rootScope.$apply(function(){deferred.resolve()});              
});

始终存在$rootScope,请使用它

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

myRootScope.$digest();

始终存在$rootScope,请使用它

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

myRootScope.$digest();

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

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

所以我整个下午都在努力解决这个问题。读了这篇文章后,我也觉得答案有问题;原来是有。以上答案都没有明确解释在何处使用
$rootScope.$digest
。这就是我的想法

首先,为什么?无论何时从非角度事件或回调响应,都需要使用
$rootScope.$digest
。这将包括纯DOM事件、jQuery事件和其他第三方Promise库,而不是属于angular的
$q

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

我希望这有助于下一个长期以来有同样问题的人

更新
我昨天删除了这篇文章,因为它被否决了。今天,我继续有这个问题,试图使用上面慷慨提供的答案。因此,我以名誉点数为代价保留我的答案,因此,我正在取消删除它

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

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

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

    $rootScope.$digest();
    done();
  }); 
something.on('ready', function(err) {
    $rootScope.$apply(function(){deferred.resolve()});              
});
注意,在某些情况下,它可能需要包装在$timeout中

再来一张。在原始问题示例中,您在错误的时间调用了
done
。在is解析后,您需要在承诺的
然后
方法(或
捕获
最终
内部调用
完成
)。您在承诺解析之前调用它,这导致
it
子句终止


所以我整个下午都在为这件事苦苦挣扎。读了这篇文章后,我也觉得答案有问题;原来是有。以上答案都没有明确解释在何处使用
$rootScope.$digest
。这就是我的想法

首先,为什么?无论何时从非角度事件或回调响应,都需要使用
$rootScope.$digest
。这将包括纯DOM事件、jQuery事件和其他第三方Promise库,而不是属于angular的
$q

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

我希望这有助于下一个长期以来有同样问题的人

更新
我昨天删除了这篇文章,因为它被否决了。今天,我继续有这个问题,试图使用上面慷慨提供的答案。因此,我以名誉点数为代价保留我的答案,因此,我正在取消删除它

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

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

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

    $rootScope.$digest();
    done();
  }); 
something.on('ready', function(err) {
    $rootScope.$apply(function(){deferred.resolve()});              
});
注意,在某些情况下,它可能需要包装在$timeout中

再来一张。在原始问题示例中,您在错误的时间调用了
done
。在is解析后,您需要在承诺的
然后
方法(或
捕获
最终
内部调用
完成
)。您在承诺解析之前调用它,这导致
it
子句终止


从角度文档

$q


从角度文档

$q


这是可行的,但似乎有点可笑,我希望有其他选择。我想这是Angular团队的一个问题。问题是当前承诺的实现与摘要周期有关(事实上,这是一个很难解决的问题,因为我们在浏览器中没有与
nextTick
方法等效的方法)。所以,是的,我担心这是您唯一的选择,只要promise结果的传播与AngularJS中的$digest循环相关联。我尝试过这一点,但现在收到一个“不再需要请求”错误。@pkozlowski.opensource我有一个问题需要从controller获取数据。请您调查一下。你能帮我吗。这是可行的,但似乎有点可笑,我希望有其他选择。我想这是Angular团队的一个问题。问题是当前承诺的实现与摘要周期有关(事实上,这是一个很难解决的问题,因为我们在浏览器中没有与
nextTick
方法等效的方法)。所以,是的,我担心这是您唯一的选择,只要promise结果的传播与AngularJS中的$digest循环相关联。我尝试过这一点,但现在收到一个“不再需要请求”错误。@pkozlowski.opensource我有一个问题需要从controller获取数据。请您调查一下。你能帮我吗