当单元测试指令时,Angular不能注入自定义服务

时间:2016-05-20 20:41:25

标签: angularjs unit-testing angularjs-directive typescript

我正在尝试测试指令,我看了几个例子,但我找不到与我相似的例子。我目前的问题是我有一个控制器附加到我的指令,Angular似乎找不到我的自定义服务,这些服务被注入控制器,但它可以找到它自己的服务。

指令

export class MyDirective implements ng.IDirective {
    constructor(private clientAppState: IClientAppState) { }
        static instance(clientAppState: IClientAppState): ng.IDirective {
            return new LocationAccessCodeDirective(clientAppState);
        }

    restrict = 'E';
    templateUrl = 'myDirectiveDirectory.html';
    controller = MyDirectiveController;
    controllerAs = 'myDirectiveController';
    scope: {};
}

angular
.module('myDirective')
.directive('myDirectiveName', MyDirective.instance);

MyDirectiveController

export class MyDirectiveController implements ILocationAccessCodeScope {

    constructor(protected $analytics: angulartics.IAnalyticsService,
                public errorMessageService: IErrorMessageService //Custom Service
                ) 
    {
        //Initializations
    }

依赖文件

MyDirectiveController.$inject = [
    '$analytics',
    'ErrorMessageService',
];

规格

describe("myDirective", () => {

    var scope;

    beforeEach(() => {
        angular.mock.module(
            'DirectiveModule',
            'ServiceModule',
            'ng',
            'myDirectiveDirectory.html'
        );

        mockErrorMessageService = sinon.stub(new MockErrorMessageService());

        angular.mock.module(($provide): void => {
            $provide.value('ErrorMessageService', mockErrorMessageService);
        });

        inject(($compile, $rootScope) => {

            scope = $rootScope.$new();

            var element = angular.element("<directive-tag></directive-tag>");
            var comEl = $compile(element)(scope);
            $rootScope.$digest();
            console.log(element[0].outerHTML);
            //Note that if I remove the (scope)
            //...from $compile(element)(scope)
            //my directive is printed out
        });
    });

    describe('first directive test', () => {
        it('first it', () => {
            console.log("it");
        });
    });
});

错误消息

Error: [$injector:unpr] Unknown provider: ErrorMessageServiceProvider <- errorMessageService

出于某种原因,Angular会将自己的Google Analytics服务注入我的控制器,但它无法找到我自己的服务,而且我似乎无法找出原因,而且我很确定我已经包含了所有相关内容文件到我的 Karma.config.js 文件

另请注意,这可能无关紧要,但我尝试将随机自定义服务注入 beforeEach 块并得到相​​同的错误,但是当使用内联注释注入它时,它找到了服务,我&# 39;我不确定为什么会这样,因为我没有缩小我的代码,正如你从依赖列表中看到的那样,它也是作为列表注入的。

1 个答案:

答案 0 :(得分:0)

问题是我在我的控制器文件之后包含了我的依赖文件,但出于某种原因,当我首先包含我的依赖文件时它开始工作。