Я полный новичок в модульном тестировании 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.