在 Angular 中使用 Karma 时出现未知提供程序错误

Unknown Provider error using Karma with Angular

我有一个模块

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

有控制器

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

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

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 在模块中没有供应商时要寻找供应商?非常感谢任何帮助。

你的问题没有显示任何对 ModifyUserController 的依赖注入,但根据你发布的错误来看,你似乎没有向控制器提供 'Users' 服务。

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 模块