Angularjs $ componentController TypeError:undefined不是对象(评估' controller.name')

时间:2016-06-24 08:39:58

标签: angularjs karma-jasmine

我正在尝试使用Jasmine对Angular 1.5.6进行单元测试。但是,我一直收到以下错误,不确定原因。

TypeError:undefined不是对象(评估' controller.name')

组件:

function MainViewerCtrl() {
    this.$onInit = function(){
        console.log('Component main viewer initialized!');
    };
    this.name = 'Main Component!';
}

angular.module('ks').component('mainViewer', {
    bindings: {
        name : '@'
    },
    controller : MainViewerCtrl,
    templateUrl: "mainViewer.html"
});

规范:

describe('Component : mainViewer', function(){

  beforeEach(angular.mock.module('ks'));

  describe('with $componentController', function () {

    var controller, scope;

    beforeEach(inject(function($rootScope, $componentController){

        scope = $rootScope.$new();
        controller = $componentController('mainViewer',
                                         {$scope:scope},
                                         {name: 'Main Component!'} );
    }));

    it('should have my binding bound', function() {

        expect(controller.name).toBeDefined();
        expect(controller.name).toBe('Main Component!');
    });
});

});

我做错了什么?

3 个答案:

答案 0 :(得分:2)

您是否尝试/看过this answer

我有类似的问题 $ componentController 是未定义的,毕竟事实证明我在我的应用程序(ui-router,ngResource)中没有添加到karma配置文件中的模块依赖项。因为他们没有加载注射只是没有正常工作。

答案 1 :(得分:1)

尝试在没有PhantomJS的情况下运行Karma,而是在Chrome或Firefox上运行。我发现将angular.mock.inject与PhantomJS结合使用会导致(对我来说)inject函数中的未定义参数并最终(甚至当我的单元测试的逻辑不需要它时)我的测试失败了。从配置的浏览器中删除PhantomJS允许我至少继续我的测试,虽然不知道根本原因是什么。

答案 2 :(得分:-1)

您必须注入_$componentController_而不是$componentController。 检查第https://docs.angularjs.org/guide/component页上的最后一个测试示例

var $componentController;
beforeEach(inject(function($rootScope, _$componentController_){
    scope = $rootScope.$new();
    $componentController = _$componentController_;
    controller = $componentController('mainViewer',
                                     {$scope:scope},
                                     {name: 'Main Component!'} );
}));