我们最近升级到Angular 1.5-rc0。最近对ngMocks的一次更改在每次测试后都会破坏$rootScope
。但是,我正在努力弄清楚为什么我们在我们的应用程序中使用的承诺在第一次之后永远不会开火。
这是一个模拟右键单击事件以测试上下文菜单指令的测试。该指令使用另一个实用程序来加载HTML模板,缓存它等等。该服务在加载模板时解析了一个承诺。
但是,对于Angular / ngMock 1.5,promise仅针对第一个“it”块进行解析。每次测试都应该重新创建$rootScope
,所以我不明白是什么阻碍了这一点。
describe('context-menu directive', function() {
beforeEach(function() {
module('templates', 'contextMenu');
inject(function(_$compile_, _$rootScope_) {
var scope = _$rootScope_.$new();
scope.choices = [{
text: 'Test',
handler: function() {}
}];
$template = _$compile_('<div context-menu="choices"></div>')(scope);
});
});
it('compiles without choices', function() {
});
it('right click triggers menu', function() {
helpers.rightClick($template);
// The event triggers a template to load and resolve a promise
// However, that promise ONLY fires if the previous "it" block is removed
$menu = $('.context-menu');
console.log($menu.length);
});
});
我尝试过手动调用$rootScope.$apply()
来强制进行承诺解析,但这对此没有帮助。
这是解决承诺的模板助手的重要部分:
var deferred = $q.defer();
// Check cache
var template = $templateCache.get(templateUrl);
if (template) {
deferred.resolve(template);
}
我已经确认调用了deferred.resolve
,但then
听众从未这样做过。