最近、Angular 1.5-rc0 にアップグレードしました。ngMocks への最近の 1 つの変更により、$rootScopeすべてのテストの後に破棄されます。ただし、アプリ内で使用する promise が初めて起動しない理由を理解するのに苦労しています。
右クリック イベントをシミュレートしてコンテキスト メニュー ディレクティブをテストするテストを次に示します。そのディレクティブは別のユーティリティを使用して、HTML テンプレートの読み込み、キャッシュなどを行います。そのサービスは、テンプレートが読み込まれたときに promise を解決します。
ただし、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リスナーは決して呼び出しません。