Ответ 1
Убедитесь, что, когда вы используете модуль после его определения, у вас нет дополнительных скобок.
Итак module('TestPSPlayer')
вместо module('TestPSPlayer',[])
.
Я пытаюсь проверить контроллер, который зависит от службы, которую я создал. Я хотел бы издеваться над этим сервисом, поскольку служба ведет переговоры с 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 для....
Убедитесь, что, когда вы используете модуль после его определения, у вас нет дополнительных скобок.
Итак module('TestPSPlayer')
вместо module('TestPSPlayer',[])
.
Также убедитесь, что вы не пытаетесь сделать это внутри вызова функции функции:
Это вызовет ошибку:
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();
});
});
В моем случае это не сработало:
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) {
}));
Если ваш провайдер не использует глобальный 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;
}