1

最近、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リスナーは決して呼び出しません。

4

0 に答える 0