为什么这个Angular指令没有在Jasmine单元测试中编译?

时间:2016-03-11 23:02:45

标签: javascript angularjs unit-testing webpack karma-jasmine

先决条件:我正在使用Karma对我的Angular.js应用模块运行Jasmine单元测试。

我的应用程序使用以下模式公开模块(服务/指令/控制器):

simple.js

'use strict';

export default (angular) => {
    angular.module('simple', [])
        .directive('simple', [function() {
            return {
                restrict: 'E',
                replace: true,
                template: '<h1>COMPILED!</h1>'
            };
        }]);
};

以上示例的相应单元测试如下所示:

simple.test.js

import angular from 'angular';
import mocks from 'angular-mocks';
import simpleModule from './simple';

describe('simple', () => {
    var $compile,
        $rootScope;

    // Load the simple module, which contains the directive
    beforeEach(() => {
        let simpleComponent = new simpleModule(angular);
        // module('simple') raises a TypeError here
        // I have also tried angular.module('simple') which
        // I am pretty sure is incorrect.
    });

    // Store references to $rootScope and $compile
    // so they are available to all tests in this describe block
    beforeEach(inject((_$compile_, _$rootScope_) => {
        // The injector unwraps the underscores (_) from around the
        // parameter names when matching
        $compile = _$compile_;
        $rootScope = _$rootScope_;
    }));

    it('Replaces the element with the appropriate content', () => {
        // Compile a piece of HTML containing the directive
        var element = angular.element("<simple>not compiled</simple>");

        var compiledElement = $compile(element)($rootScope);

        // fire all the watches, so the scope expressions evaluate
        $rootScope.$digest();

        // Check that the compiled element contains the templated content
        expect(element.html()).toContain("COMPILED!");

    });

});

问题:在网络浏览器中使用Karma运行上述测试时,测试失败并且元素似乎没有被编译。

我错过了什么?

3 个答案:

答案 0 :(得分:2)

我可以在您的代码中看到您在执行$compile之前错过了新it('Replaces the element with the appropriate content', () => { // Compile a piece of HTML containing the directive var scope = $rootScope.$new(); // create a new scope var element = angular.element("<simple>not compiled</simple>"); var compiledElement = $compile(element)(scope); // fire all the watches, so the scope expressions evaluate scope.$digest(); // Check that the compiled element contains the templated content expect(element.html()).toContain("COMPILED!"); }); 的创建。你应该这样做:

{{1}}

答案 1 :(得分:0)

我怀疑你没有正确导入指令。你试过了吗?

beforeEach(module('simple'));

您指示您尝试的替代版本不正确或是我没见过的模式:

beforeEach(() => {
    let simpleComponent = new simpleModule(angular);
});

module('simple');

angular.module('simple');

答案 2 :(得分:0)

显而易见的是,您在测试中使用的是Javascript ES6。 Jasmine目前只了解ES5。

尝试使用此Jasmine ES6 Compiler,或在ES5中编写测试。

注意:您的测试没有被编译但是它们失败似乎是矛盾的。只有当业力试图运行它们时,它们才会失败。它们只能在编译后运行。你确定吗?