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

Внедрение макетной службы для проверки контроллера угловой системы

Я пытаюсь проверить контроллер, который зависит от службы, которую я создал. Я хотел бы издеваться над этим сервисом, поскольку служба ведет переговоры с 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 для....

4b9b3361

Ответ 1

Убедитесь, что, когда вы используете модуль после его определения, у вас нет дополнительных скобок. Итак module('TestPSPlayer') вместо module('TestPSPlayer',[]).

Ответ 2

Также убедитесь, что вы не пытаетесь сделать это внутри вызова функции функции:

Это вызовет ошибку:

    beforeEach(inject(function(someOtherService) {
        module('theApp', function($provide) {
            myMock = {foo: 'bar'};
            $provide.value('myService', myServiceMock);
            someOtherService.doSomething();
        });
    }));

Это не будет:

    beforeEach(function() {
        module('theApp', function($provide) {
            myMock = {foo: 'bar'};
            $provide.value('myService', myServiceMock);
        });

        inject(function(someOtherService) {
           someOtherService.doSomething();
        });
    });

Ответ 3

В моем случае это не сработало:

beforeEach(module('user'));
beforeEach(inject(function ($http) {
}));

beforeEach(module('community'));
beforeEach(inject(function ($controller, $rootScope) {
}));

Я изменил это, чтобы заставить его работать:

beforeEach(module('user'));
beforeEach(module('community'));

beforeEach(inject(function ($http) {
}));
beforeEach(inject(function ($controller, $rootScope) {
}));

Ответ 4

Если ваш провайдер не использует глобальный init, вы можете использовать оригинального поставщика инъекций и издеваться над ним. в приведенном ниже примере тестируемыйProvider является вашим контроллером.

var injectedProviderMock;

beforeEach(function () {
    module('myModule');
});

beforeEach(inject(function (_injected_) {
    injectedProviderMock  = mock(_injected_);
}));


var  testedProvider;
beforeEach(inject(function (_testedProvider_) {
    testedProvider = _testedProvider_;
}));

it("return value from injected provider", function () {
    injectedProviderMock.myFunc.andReturn('testvalue');
    var res = testedProvider.executeMyFuncFromInjected();
    expect(res).toBe('testvalue');
});

//mock all provider methods
function mock(angularProviderToMock) {

    for (var i = 0; i < Object.getOwnPropertyNames(angularProviderToMock).length; i++) {
        spyOn(angularProviderToMock,Object.getOwnPropertyNames(angularProviderToMock)[i]);
    }
    return angularProviderToMock;
}