Внедрение фиктивного сервиса для теста контроллера angularjs

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

Вот мой текущий тест:

describe('Player Controllers', function () {

    beforeEach(function () {
        this.addMatchers({
            toEqualData: function (expected) {
                return angular.equals(this.actual, expected);
            }
        });
    });

    describe('TestPSPlayerModule', function () {
        var $httpBackend, scope, ctrl;

        beforeEach(module('PSPlayerModule'));

        beforeEach(inject(function (_$httpBackend_, $rootScope, $controller) {
            $httpBackend = _$httpBackend_;

            scope = $rootScope.$new();
            ctrl = $controller(PlayerController, { $scope: scope });
        }));

        it('should request a clip url from the server when clipClicked is called', function () {
            expect(1).toBe(1);
        });
    });

});

Мой контроллер выглядит так:

w.PlayerController = function ($scope, $http, $window, speedSlider, $location) {
   ...
}

так что я хочу издеваться над speedSlider.

У меня возникла идея использовать модуль, который я создал в своем тестовом коде, который мог бы обеспечить поддельную реализацию ползунка скорости, поэтому я добавил следующее в начало файла test.js:

module('TestPSPlayerModule', []).factory('speedSlider', function () {
    return = {
      ...
    };
});

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

Injector already created, can not register a module!

Поэтому я полагаю, что для меня должен быть лучший способ предоставить фиктивную реализацию одного из моих сервисов. Что-то, что я мог бы использовать sinon.js для....

21
задан Tomas Romero 17 May 2013 в 20:43
поделиться