如何在Jasmine测试中使用我的templateCache模块?

时间:2015-09-08 13:03:21

标签: javascript angularjs jasmine angular-templatecache

我不想使用karma-ng-html2js-preprocessor或$ httpBackend。我有一个动态创建的templateCache模块。

app.js

angular.module('myApp', ['ngRoute', 'ui.bootstrap', 'ui.router', 'appTemplates']);

templates.js

(function(){

'use strict';

angular.module('appTemplates', []).run(['$templateCache',
    function($templateCache) {
        $templateCache.put('js/Templates/datetimepicker.html', '<div>My html here</div>');
    }
]);
})();

指令

datetimepicker.js

angular.module('myApp').directive('datetimepicker',
    function () {
        return {
            restrict: 'A',
            replace: false,
            templateUrl: 'js/Templates/datetimepicker.html'
        };
    }
);

问题是,我的测试似乎不想在编译指令时使用templateCache。

test.js

(function () {

"use strict";

describe("Datetimepicker directive tests", function () {

    var scope, templateCache, element;

    // load the directive's module
    beforeEach(module('myApp'));

    beforeEach(inject(function ($rootScope, $templateCache) {
        scope = $rootScope;
        templateCache = $templateCache;


    }));

    it('should exist', inject(function ($compile) {

       //this console.log prints out the correct HTML from cache
  //console.log(templateCache.get('js/Templates/datetimepicker.html'));

        element = angular.element('<div data-datetimepicker></div>');
        element = $compile(element)(scope);
        // this logs the element
        console.log(element);
        //this $digest call throws the error
        scope.$digest();

        console.log(element);

        expect(element.html()).toContain('div');
    }));
});
})();

我明白了:

Error: Unexpected request: GET template/datepicker/datepicker.html

运行测试时,我的控制台中的$ httpBackend不再需要请求。

任何帮助表示赞赏。感谢

3 个答案:

答案 0 :(得分:2)

任何一个指令模块都应该将模板缓存模块作为依赖项引用:

angular.module('myApp', ['appTemplates']).directive('datetimepicker',

或者在测试中手动加载模块:

// load the directive's module
beforeEach(module('myApp'));
beforeEach(module('appTemplates'));

否则模板缓存模块run方法将无法执行,因此缓存中没有模板。

答案 1 :(得分:0)

对请求使用 $ httpBackend 模拟服务。

//expect a GET request to a url.
$httpBackend.expectGET('whatever url you want');
//...place your code.

//flush pending requests.
$httpBackend.flush();

有关详细信息,请参阅official angular $httpBackend service page.

答案 2 :(得分:0)

线索出现了错误。 datetimepicker指令包含一个名为datepicker的Angular-UI指令。正是这导致了错误。我想我的指令不是单元可测试的,我将专注于这个的E2E测试。因此,这个问题具有误导性,因为模板实际上包含的HTML比我在这里发布的更多。不管怎样,谢谢!希望这个答案可以帮助那些得到同样错误的人!