Кажется, что promises не разрешают в тестах Angular/Jasmine, если вы не нажмете $scope.$digest()
. Это глупая ИМО, но это нормально, я работаю там, где это необходимо (контроллеры).
Ситуация, в которой я сейчас работаю, - это сервис, который может заботиться о каких-либо областях приложения, но он возвращает некоторые данные с сервера, но обещание, похоже, не решает.
app.service('myService', function($q) {
return {
getSomething: function() {
var deferred = $q.defer();
deferred.resolve('test');
return deferred.promise;
}
}
});
describe('Method: getSomething', function() {
// In this case the expect()s are never executed
it('should get something', function(done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
expect(1).toEqual(2);
});
done();
});
// This throws an error because done() is never called.
// Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
it('should get something', function(done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
expect(1).toEqual(2);
done();
});
});
});
Каков правильный способ протестировать эту функциональность?
Изменить: решение для справки. Очевидно, вы вынуждены вводить и переваривать $rootScope, даже если служба не использует его.
it('should get something', function($rootScope, done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
});
$rootScope.$digest();
done();
});