Karma error: unknown provider

Karma error: unknown provider

我们正在尝试使用 Karma 测试我们的控制器,但 Karma 一直抱怨未知提供商:

Error: [$injector:unpr] Unknown provider: userProvider <- user

我们是否正确注入 user

我们的代码:

控制器-test.js:

describe('Controller', function () {
    beforeEach(module('myApp'));

    var ctrl, scope, user;

    beforeEach(inject(function ($controller, $rootScope, _user_) {
        scope = $rootScope.$new();
        ctrl = $controller('controller', {
            $scope: scope
        });
        user = _user_;
    })); 

    it("should have scope defined", function () {
        expect(scope).toBeDefined();
    });
});

app.js:

(function () {
    var myApplication = angular.module("myApp", [
        "angucomplete-alt"            
    ]);

    fetchData().then(bootstrapApplication);

    function fetchData() {
        var initInjector = angular.injector(["ng"]);
        var $http = initInjector.get("$http");

        // Get user info before app is loaded
        return $http.get('/api/user').then(function (response) {
            myApplication.value("user", response.data);
        }, function (errorResponse) {
            // Handle error case
            console.error("Obtaining user information failed when bootstrapping Angular app");
        });
    }

    function bootstrapApplication() {
        angular.element(document).ready(function () {
            angular.bootstrap(document, ["myApp"]);
        });
    }
})();

controller.js:

angular.module("myApp")
.controller("controller", ["$scope", "user", "$window",
    function ($scope, user, $window) { ... }]);

测试您的控制器时,您应该单独进行。我会简单地将模拟的 user 对象放入 locals hashmap(连同 $scope),例如

describe('Controller', function() {
    var ctrl, scope, user, $window;

    beforeEach(function() {
        user = {
            id: 'fake_id',
            username: 'fake_username'
        };
        $window = jasmine.createSpyObj('$window', ['some', 'methods']);

        module('myApp');

        inject(function($rootScope, $controller) {
            scope = $rootScope.$new();
            ctrl = $controller('controller', {
                $scope: scope,
                user: user,
                $window: $window
            });
        });
    });
});

示例规范可能是测试注入的 user 对象是否放置在范围内。例如

it('puts the user onto the controller scope', function() {
    expect(scope.user).toBe(user);
});

ngMock 到位的单元测试中(我假设你有),所有 $http 调用都会通过不执行真正 HTTP 调用的模拟后端 ($httpBackend)除非专门配置为这样做。

即使您的 fetchData 函数在测试时 运行(我怀疑它没有做其他事情,您会收到一些控制台错误),它也不会检索任何数据。