Карма ошибка неизвестного провайдера

Я полный новичок в модульном тестировании javaScript, angularJS и Karma. Мне удалось написать проходные тесты для контроллеров, но теперь, когда я пытаюсь протестировать службы, я получаю следующую ошибку: Unknown provider <- nProvider <- User, где Пользователь — это имя моей службы, и, насколько я могу судить, " n" — это зависимость $http для этой службы (минифицированная). Вот мой UserService (TypeScript):

/// <reference path="../../lib/angular/angular.d.ts" />


module MyApp.Services{
    export class UserService{
        private _apiBase: string = "api/";

        constructor(private $http: ng.IHttpService, private $q: ng.IQService) {

        }

        getUser(userSearchParams: string): ng.IPromise{
            var deferred = this.$q.defer();
            this.$http.get(this._apiBase + "Users/" + userSearchParams).success((data) => {
                deferred.resolve(data);
            }).error(() => {
                deferred.reject();
            });

            return deferred.promise;
        }

    }
}

и вот мой общий файл Services.ts:

/// <reference path="../_all.d.ts" />

'use strict'

var mod = angular.module('MyApp.Services', []);

mod.factory('User', [<any>"$http", <any>"$q", function ($http, $q) {
    return new MyApp.Services.UserService($http, $q);
}]);

и, наконец, мой тестовый скрипт:

'use strict';

describe('UserServiceTests', function () {

beforeEach(module('main'));  //this is my main angular module - set up in app.ts

it('should issue a GET request to api/Users/whatever when the search parameter is whatever', inject(function(User) {
    expect(2).toBe(2);
}));

})

Я создал еще одно тестовое приложение с такой же структурой, но ошибка, показанная выше, не возникает. Я не знаю, что мне не хватает. Дайте мне знать, если есть что-то еще, что мне нужно опубликовать, чтобы найти проблему. Любая помощь приветствуется.

Изменить: после долгих поисков и чтения выяснилось, что это связано с внедрением зависимостей здесь и здесь. При минификации имена параметров изменяются, что вызывает ошибку. В качестве доказательства, если я удалю файлы min и повторно запущу тесты, они пройдут.

Чтобы исправить это, можно использовать функцию $inject, но я не понимаю, как это сделать, когда контроллер создается как класс с использованием TypeScript. Я не уверен, могу ли я использовать свойство разрешения $routeProvider.when.


person Matt M    schedule 09.07.2013    source источник


Ответы (1)


Хорошо, я нашел этот пост, который позволил мне решить проблему . Добавляя свойство «inject» в мои классы TypeScript (с соответствующими значениями в массиве), Angular знает, как обрабатывать DI. Единственный недостаток, который я вижу, — это потенциальная ошибка в порядке перечисления зависимостей или упущение в случае, если новая зависимость будет добавлена ​​позже.

person Matt M    schedule 10.07.2013