Angularjs 如何使用注入服务测试角度1.6组件?

Angularjs 如何使用注入服务测试角度1.6组件?,angularjs,unit-testing,karma-jasmine,angular-components,angularjs-1.6,Angularjs,Unit Testing,Karma Jasmine,Angular Components,Angularjs 1.6,我想测试我的角度分量,它在语法上基于: 但是,此设置使我遇到以下错误: TypeError:undefined不是构造函数(正在计算“$componentController('MyModule',null,bindings)”) 上面的代码有$componentController('MyModule'…),没有MyModule组件 调用spyOn(MyService…时,MyService变量未定义。这将引发一个错误,阻止正确引导应用程序 如果测试台使用PhantomJS,这可能会导致每个块

我想测试我的角度分量,它在语法上基于:

但是,此设置使我遇到以下错误:

TypeError:undefined不是构造函数(正在计算“$componentController('MyModule',null,bindings)”)


上面的代码有
$componentController('MyModule'…
),没有
MyModule
组件

调用
spyOn(MyService…
时,
MyService
变量未定义。这将引发一个错误,阻止正确引导应用程序

如果测试台使用PhantomJS,这可能会导致每个块之前的
错误抑制,为了正确报告错误,建议使用Chrome Karma启动器

如果问题是
MyService
在定义模拟服务时未定义,则可以将其就地定义为存根:

beforeEach(module(function ($provide) {
    $provide.value('MyService', {
      serviceFunc: jasmine.createSpy().and.callThrough()
    });
}));

没有“MyModule”组件…@estus:
MyModule
是一个模块,由组件
MyCmpnt
和相应的控制器
MyCtrl
组成。你是什么意思?你在做
$componentController('MyModule'…
,没有MyModule组件。这正是错误消息所说的。这是MyCmpnt。不是MyModule。你说得对,谢谢,这是一个打字错误,但上面的错误仍然存在,因为
$componentController
未定义。这意味着注入甚至还没有执行。这不符合要求。
不是常量构造函数
不仅意味着某些东西没有定义,还意味着构造函数没有定义。Angular只对控制器和
服务
服务使用构造函数。我建议再次检查您在运行的规范中是否已更正此错误,因为我看不到上述代码对此错误的其他合理解释。如果问题因此,考虑提供一个可以复制这个错误的块/小提琴。BTW,你在上面的代码中有<代码> MyService < /代码>变量未定义(<代码> SPYON(MyService…< /代码>将扔)),这意味着发布的代码与真实代码不同。
'use strict';

describe('component: MyCmpnt', function () {

    var $componentController,
        MyService;

    beforeEach(module('MyModule'));

    beforeEach(module(function ($provide) {
        $provide.value('MyService', MyService);

        spyOn(MyService, 'serviceFunc').and.callThrough();
    }));

    beforeEach(inject(function (_$componentController_) {
        $componentController = _$componentController_;
    }));


    it('should initiate the component and define bindings', function () {

        var bindings = {
            foo: 'baz',
            bar: []
        };

        var ctrl = $componentController('MyCmpnt', null, bindings);

        expect(ctrl.foo).toBeDefined();
    });
});
beforeEach(module(function ($provide) {
    $provide.value('MyService', {
      serviceFunc: jasmine.createSpy().and.callThrough()
    });
}));