我有一个使用$http
下载某些内容的指令。我设置了一个缓存,所以无论我在页面上使用指令多少次,内容都只下载一次。问题出在我的测试代码中,承诺永远不会解决!我已拨打scope.$digest
和$rootScope.$digest
,但似乎没有触发解析功能。
当我在浏览器中实际加载它们时,promises会完美解析。我已设置plunk来显示问题。它有$http
版本的简化$q
版本来显示问题。这是指令代码的副本:
(function(){
var httpPromise = null;
angular.module("plunker").directive("httpPromise", function($http) {
return {
restrict: "E",
compile: compile
}
function compile(tElement, tAttrs) {
tElement.html("<em>Promise not yet resolved.</em>");
if(httpPromise === null) {
console.log("making remote call (should show up once per HTML file)");
httpPromise = $http({
method: "GET",
url: "https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"
});
}
return link;
}
function link(scope, element, attributes) {
httpPromise.then(function(){ element.html("<strong>Promise resolved!</strong>"); });
}
});
})();
答案 0 :(得分:1)
第beforeEach(module("plunker"))
行使用angular-mock
模块在每次测试运行之前完全重新初始化模块,包括$rootScope
。这意味着使用与指令绑定不同的$rootScope
来初始化promise,因此调用$rootScope.$digest
不会执行任何操作。
有两种方法可以解决这个问题。
存储对缓存使用的$rootScope
的引用,并在其上调用.$digest
。我决定这样做,并添加plunk显示如何。
编写测试,期望每次都重新创建缓存。