Подтвердить что ты не робот

Инжектор уже создан. не может зарегистрировать модуль

Я новая пчела для Angular JS и пытаюсь сделать что-то из нее правильным способом TDD, но во время тестирования я получаю эту ошибку:

Инжектор уже создан, не может зарегистрировать модуль!

Это сервис, о котором я говорю.

bookCatalogApp.service('authorService', ["$resource", "$q", function($resource, $q){

    var Author =$resource('/book-catalog/author/all',{},{
        getAll : { method: 'GET', isArray: true}
    });

    var authorService = {};

    authorService.assignAuthors = function(data){
        authorService.allAuthors = data;
    };

    authorService.getAll = function(){
        if (authorService.allAuthors)
            return {then: function(callback){callback(authorService.allAuthors)}}

        var deferred = $q.defer();
        Author.getAll(function(data){
            deferred.resolve(data);
            authorService.assignAuthors(data);
        });
        return deferred.promise;
    };

    return authorService;
}]);

Это тест для вышеуказанной службы

describe("Author Book Service",function(){
    var authorService;
    beforeEach(module("bookCatalogApp"));
    beforeEach(inject(function($injector) {
        authorService = $injector.get('authorService');
    }));

    afterEach(function() {
        httpBackend.verifyNoOutstandingExpectation();
        httpBackend.verifyNoOutstandingRequest();
    });

    describe("#getAll", function() {
        it('should get all the authors for the first time', function() {
            var authors = [{id:1 , name:'Prayas'}, {id:2 , name:'Prateek'}];

            httpBackend.when('GET', '/book-catalog/author/all').respond(200, authors);

            var promise = authorService.getAll();

            httpBackend.flush();
            promise.then(function(data){
                expect(data.length).toBe(2)
            });
        });

        it('should get all the authors as they have already cached', function() {
            authorService.allAuthors = [{id:1 , name:'Prayas'}, {id:2 , name:'Prateek'}];

            var promise = authorService.getAll();

            promise.then(function(data){
                expect(data.length).toBe(2)
            });
        });

    });
})

Любая помощь будет оценена.

4b9b3361

Ответ 1

Если вы смешиваете вызовы с module('someApp') и inject($someDependency), вы получите эту ошибку.

Все ваши вызовы module('someApp') должны появиться перед вашими вызовами на inject($someDependency).

Ответ 2

Вы неправильно используете функцию ввода. Как указано в документации, функция ввода уже создает экземпляр $injector. Мое предположение заключается в том, что, передавая $injector в качестве аргумента функции инъекции, вы просите его дважды создать службу инжектора $.

Просто используйте инспектор для передачи в службе, которую вы хотите проверить. Под обложками впрыск будет использовать службу инжектора $, которую он создает для захвата услуг.

Вы можете исправить эту проблему, изменив вторую инструкцию beforeEach на:

beforeEach(inject(function(_authorService_) {
    authorService = _authorService_;
}));

Еще одно замечание. Аргумент authorService, переданный в инъекционную функцию, был обернут "_", поэтому имя не скрывает переменную, созданную в функции описания. Это также описано в документации .

Ответ 3

Не уверен, что это причина, но ваш beforeEach должен выглядеть следующим образом:

beforeEach(function() {
  inject(function($injector) {
    authorService = $injector.get('authorService');
  }
});