(Здесь есть связанный вопрос: тест Jasmine не видит модуль AngularJS )
Я просто хочу протестировать службу без начальной загрузки Angular.
Я просмотрел несколько примеров и учебник, но никуда не собираюсь.
У меня всего три файла:
myService.js: где я определяю сервис AngularJS
test_myService.js: где я определяю тест Jasmine для службы.
specRunner.html: файл HTML с нормальной конфигурацией жасмина, куда я импортирую два предыдущих файла, а также Jasmine, Angularjs и angular-mocks.js.
Это код службы (которая работает должным образом, когда я не тестирую):
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
Поскольку я пытаюсь протестировать службу изолированно, у меня должна быть возможность получить к ней доступ и проверить их методы. Мой вопрос: как я могу внедрить сервис в свой тест без начальной загрузки AngularJS?
Например, как я могу проверить значение, возвращаемое для метода службы с помощью Jasmine, например:
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
beforeEach
в случае, если для службы необходимо много ... много ... много тестов? Тестирование модели данных (сервиса), которая содержит массу глобальных переменных. Спасибо, C§Хотя приведенный выше ответ, вероятно, работает нормально (я его не пробовал :)), мне часто приходится запускать гораздо больше тестов, поэтому я не ввожу их в сами тесты. Я сгруппирую случаи it () в блоки описания и запускаю свою инъекцию в beforeEach () или beforeAll () в каждом блоке описания.
Роберт также прав в том, что он говорит, что вы должны использовать инжектор Angular $, чтобы тесты знали об услуге или фабрике. Angular сам использует этот инжектор в ваших приложениях, чтобы сообщить приложению, что доступно. Однако его можно вызывать более чем в одном месте, а также можно вызывать неявно, а не явно. Вы заметите, что в моем примере тестового файла спецификации ниже, блок beforeEach () неявно вызывает инжектор, чтобы сделать вещи доступными для назначения внутри тестов.
Возвращаясь к группировке и использованию блоков before, вот небольшой пример. Я создаю службу Cat и хочу ее протестировать, поэтому моя простая установка для написания и тестирования службы будет выглядеть так:
app.js
Спецификация: Контроллер кошек
Спецификация: Обслуживание кошек
РЕДАКТИРОВАТЬ Основываясь на некоторых комментариях, я обновил свой ответ, сделав его немного более сложным, и я также создал Plunkr, демонстрирующий модульное тестирование. В частности, в одном из комментариев упоминается: «Что, если у службы контроллера есть простая зависимость, например $ log?» - который включен в пример с тестовыми случаями. Надеюсь, поможет! Испытайте или взломайте планету !!!
https://embed.plnkr.co/aSPHnr/
источник
Мне нужно было протестировать директиву, которая требовала другой директивы, Google Places Autocomplete , я обсуждал, стоит ли мне просто высмеивать ее ... в любом случае это сработало без каких-либо ошибок для директивы, которая требовала gPlacesAutocomplete.
источник
Если вы хотите протестировать контроллер, вы можете ввести и протестировать его, как показано ниже.
источник