使用带有Angular的Karma的未知提供程序错误

时间:2018-01-25 01:02:42

标签: angularjs karma-runner

我有一个模块

export default angular.module('pfui.user', [])
    .controller('ModifyUserController', ModifyUserController)

有一个控制器

export default class ModifyUserController{ 
    userid:string;
    ...
}

我正在尝试创建一个单元测试,可以测试控制器中调用服务来执行某些操作的某些方法。这是我的业力脚本 -

describe('ModifyUserControllerTester', function () {
    var $controller;
    beforeEach(angular.mock.module('ui.router'));
    beforeEach(angular.mock.module('pfui.user'));
    beforeEach(inject(function (_$controller_) {
        $controller = _$controller_;
    }));

    describe('Test', function () {
        it('test accessing controller', function () {
            let $scope = {};
                var controller = $controller('ModifyUserController', {
                $scope: $scope
             });
            expect($scope['userid']).toBe(undefined);
        });
    });
});

当我运行测试时,我收到错误

Error: [$injector:unpr] Unknown provider: UsersProvider <- Users <- ModifyUserController

最初我收到$ stateProvider缺失的错误。所以我添加了

beforeEach(angular.mock.module('ui.router'));

并且该错误消失了。

这是我第一次尝试写一个Karma测试。我不确定我错过了什么。为什么当我没有在模块中有一个供应商时,Karma正在寻找供应商?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的问题没有显示对ModifyUserController的任何依赖注入,但是通过您发布的错误,看起来您还没有提供“用户”#39;为控制器提供服务。

describe('ModifyUserControllerTester', function () {
    var $controller;
    var mockUsers;
    beforeEach(angular.mock.module('ui.router'));
    beforeEach(angular.mock.module('pfui.user'));
    beforeEach(inject(function (_$controller_) {
        $controller = _$controller_;
    }));

    describe('Test', function () {
        it('test accessing controller', function () {
        //----define your mock dependency here---//
        let mockUsers = jasmine.createSpyObj('mockUsers', ['user_method1', 
            'user_method2',...]);
            let $scope = {};
                var controller = $controller('ModifyUserController', {
                $scope: $scope,
                Users: mockUsers
            });
            expect($scope['userid']).toBe(undefined);
        });
    });
});

PS。由于单独测试的最佳实践是单独进行的,因此您还应考虑提供模拟状态提供程序与导入实际的ui.router模块