Ответ 1
Попробуйте позвонить $timeout.flush()
до expect(result).toBe('Resolved Data');
.
Следующий тест продолжает терпеть неудачу, и я не могу понять, почему? Я пытаюсь выяснить, как тестировать дефериды / promises с Жасмином.
Ошибка
Expected undefined to be 'Resolved Data'.
Тест
describe('Queued Repository', function () {
var ctrl,
rootScope,
scope,
service;
beforeEach(function () {
module('testApp');
inject(function ($rootScope, $controller, TestSrvc) {
rootScope = $rootScope;
scope = $rootScope.$new();
service = TestSrvc;
});
});
afterEach(inject(function ($rootScope) {
$rootScope.$apply();
}));
it('test something', function () {
expect(service.calculate(1, 5)).toBe(6);
});
it('resolves promises', function () {
var result;
service.getPromise().then(function (data) {
result = data;
});
rootScope.$apply();
expect(result).toBe('Resolved Data');
});
});
Сервис
var app = angular.module('testApp', []);
app.service('TestSrvc', ['$q', '$timeout', '$http', function ($q, $timeout, $http) {
return {
getPromise: function () {
var d = $q.defer();
$timeout(function () {
d.resolve('Defered Result');
}, 5000);
return d.promise;
},
getSomething: function () {
return "Test";
},
calculate: function (x, y) {
return x + y;
}
}
}]);
Попробуйте позвонить $timeout.flush()
до expect(result).toBe('Resolved Data');
.
В вашем примере вам нужно позвонить как $timeout.flush()
AND $rootScope.$apply()
.
Объяснение: $timeout.flush()
заставит ваш $timeout
в службе запускаться немедленно. Затем ваша служба вызовет "resolve
", но promise.then()
не будет вызываться до следующего цикла дайджест; поэтому вам нужно будет вызвать $rootScope.$apply()
для распространения любых "разрешений" и "часов", которые будут происходить синхронно.
NOTE:
В Jasmine убедитесь, что ваша функция promise.then()
показывает BEFORE
ваш вызов $rootScope.$apply
, иначе он не будет запускать функцию promise.then()
. (Я не понял, почему это происходит в Жасмине.)