基本的Karma Angular 1.5组件测试

时间:2016-07-22 19:54:27

标签: javascript angularjs karma-jasmine

我不确定我所做的事情是完全错误的,但当我从"指令"到"组件"为了定义我的一些HTML元素,我突然打破了所有的Karma测试。这就是我所拥有的:

karam.conf.js

...
preprocessors: {
    'module-a/module-a.view.html': ['ng-html2js'],
    ...,
    'module-z/module-z.view.html': ['ng-html2js']
},

ngHtml2JsPreprocessor: {
    moduleName: 'theTemplates'
},
...

模块a.component.js

(function(){
    "use strict";

    angular.module('ModuleA').component('moduleAComponent',{
        controller: 'ModuleAController as moduleAVm',
        templateUrl: 'module-a/module-a.view.html'      
    });
})();

模块-A-tests.js

"use strict";

describe('ModuleA',function(){

    beforeEach(module('ModuleA'));

    describe('Controller',function(){
        ...
    });

    describe('Component',function(){
        var element, $rootScope;
        beforeEach(module('theTemplates'));
        beforeEach(inject([
            '$compile','$rootScope',
            function($c,$rs) {
               $rootScope = $rs;
               element = $c('<module-a-component></module-a-component>')($rootScope);
               $rootScope.$digest(); // ???
            }
        ]));

        it('should have moduleAVm',function(){
            expect(element.html()).not.toBe(''); // FAILS HERE
            expect(element.html()).toContain('moduleVm'); // FAILS HERE TOO
        });

    });

});

错误:

Expected '' not to be ''.

1 个答案:

答案 0 :(得分:3)

好的,在更彻底地阅读Angular的documentation后,我发现了这句话:

  

对元件控制器进行单元测试的最简单方法是使用   $ componentController包含在ngMock中。这样做的好处   方法是您不必创建任何DOM元素。该   以下示例显示了如何为heroDetail组件执行此操作   从上面。

它突然出现在我身上,我的描述('Controller',function(){...});是我真正需要改变的,我应该摆脱'组件'部分,正式称为'指令'

现在这是我的'控制器':

    beforeEach(inject([
        '$componentController', // replaced $controller with $componentController
        function($ctrl){
            ctrl = $ctrl('queryResults',{ // Use component name, instead of controller name
                SomeFactory:MockSomeFactory,
                SomeService:MockSomeService
            });
        }
    ]));

现在,我仍然可以测试我的控制器,同时测试组件。而且我不再需要使用$ compile,$ rootScope等创建DOM元素。