Ответ 1
Итак, вы хотите протестировать, если ваши ответы службы ожидаются? Тогда это то, что вы бы предпочли проверить на службе. Unit test методы, основанные на обещаниях, могут выглядеть следующим образом:
var mapService, $httpBackend, $q, $rootScope;
beforeEach(inject(function (_mapService_, _$httpBackend_, _$q_, _$rootScope_) {
mapService = mapService;
$httpBackend = _$httpBackend_;
$q = _$q_;
$rootScope = _$rootScope_;
// expect the actual request
$httpBackend.expect('GET', '/onmap/rest/map/uuid?editor=true');
// react on that request
$httpBackend.whenGET('/onmap/rest/map/uuid?editor=true').respond({
success: {
elements: [1, 2, 3]
}
});
}));
Как вы можете видеть, вам не нужно использовать $injector
, так как вы можете напрямую вставлять нужные вам службы. Если вы хотите использовать правильные имена служб во время своих тестов, вы можете вводить их с префиксами и суффиксами "_", inject()
достаточно умен, чтобы распознать, какую услугу вы имеете в виду. Мы также настраиваем $httpBackend
mock для каждой спецификации it()
. И мы установили $q
и $rootScope
для последующей обработки.
Здесь вы можете проверить, что ваш метод обслуживания возвращает обещание:
it('should return a promise', function () {
expect(mapService.getMapUuid('uuid', true).then).toBeDefined();
});
Поскольку у обещания всегда есть метод .then()
, мы можем проверить это свойство, чтобы убедиться, что это обещание или нет (конечно, другие объекты тоже могут иметь этот метод).
Затем вы можете проверить свое обещание, которое вы получите, с правильной стоимостью. Вы можете сделать это, настроив deferred
, который вы явно разрешите.
it('should resolve with [something]', function () {
var data;
// set up a deferred
var deferred = $q.defer();
// get promise reference
var promise = deferred.promise;
// set up promise resolve callback
promise.then(function (response) {
data = response.success;
});
mapService.getMapUuid('uuid', true).then(function(response) {
// resolve our deferred with the response when it returns
deferred.resolve(response);
});
// force `$digest` to resolve/reject deferreds
$rootScope.$digest();
// make your actual test
expect(data).toEqual([something]);
});
Надеюсь, это поможет!