Дополнительно
Инжектирование зависимых служб при модульном тестировании служб AngularJS
Я тестирую службу A, но служба A зависит от службы B (т. е. служба B внедряется в службу A).
Я видел этот вопрос, но мой случай немного отличается, потому что, на мой взгляд, имеет смысл подражать сервису B вместо того, чтобы инжектировать реальный экземпляр сервиса B. Я бы подражал ему с помощью jasmine spy.
Вот пример теста:
describe("Sample Test Suite", function() {
beforeEach(function() {
module('moduleThatContainsServiceA');
inject([
'serviceA', function(service) {
this.service = service;
}
]);
});
it('can create an instance of the service', function() {
expect(this.service).toBeDefined();
});
});
Ошибка, которую я получаю:
Ошибка: Неизвестный провайдер: serviceBProvider
Как я могу сделать что-то подобное?
51
5
На самом деле в AngularJS Dependency Injection используется правило 'last wins'. Таким образом, вы можете определить свой сервис в тесте сразу после включения модуля и зависимостей, а затем, когда тестируемый вами сервис A запросит сервис B с помощью DI, AngularJS выдаст mocked-версию сервиса B.
Часто это делается путем определения нового модуля, например MyAppMocks, помещения туда подражаемых сервисов/значений, а затем просто добавления этого модуля в качестве зависимости.
Типа того (схематично):
Я делал это на CoffeeScript и обнаружил лишнюю загвоздку. (Кроме того, код на этой странице показался мне запутанным.) Вот полный рабочий пример:
Без явного возврата null после
$provide.value
я продолжал получатьError: Argument 'fn' is not a function, got Object
. Я нашел ответ в этой теме Google Groups.Мне помогло решение с Валентином, но есть и другая альтернатива.
Тогда при запросе AngularJS сервиса A к сервису B через Dependency Injection, вместо сервиса B из moduleThatContainsServiceA будет предоставлен ваш макет сервиса B.
Таким образом, вам не нужно создавать дополнительный модуль Angular только для имитации сервиса.
Я считаю самый простой способ это просто, чтобы придать обслуживание B и глумиться над ней. например, автомобиль служба зависит от службы двигателя. Теперь нам нужно глумиться двигателя при тестировании автомобиля:
Ссылка: https://github.com/angular/angular.js/issues/1635
Это работало для меня. Ключевым является определение реального модуля на поругание. Звоню угловой.глумитесь.модуль делает из модуля и позволяет вещам быть подключен.