我需要创建以下单元测试,它依赖于正在解析的服务中的promise,但是从不调用finally()回调。该承诺在实际应用中运行良好。我已经在各个地方读过我需要开始一个摘要周期,但这不起作用。我正在使用ui-router,它只是启动$ stateChangeStart请求并尝试检索第一个状态的模板。 (因此$ httpBackend模拟了它。)
var $rootScope;
var scope;
var $httpBackend;
var FormulaValidator;
var mockFunctionApiBaseUrl = 'http://localhost:5555';
beforeEach(function() {
module('ps', function($provide) {
$provide.constant('functionApiBaseUrl', mockFunctionApiBaseUrl);
$provide.value('identity', {
getUsernameFromLocalStorage: function() {
console.log('getting mock username from local storage');
return 'BLAH';
},
verifyToken: function(token) {
return true;
}
});
});
beforeEach(function(done) {
inject(function(_$httpBackend_, _$rootScope_, _FormulaValidator_) {
$httpBackend = _$httpBackend_;
$rootScope = _$rootScope_;
scope = $rootScope.$new();
FormulaValidator = _FormulaValidator_;
$httpBackend.expect('GET', mockFunctionApiBaseUrl + '/api/list/functions').respond(200, '{"MA": {}}');
$httpBackend.expect('GET', '/0.1.1/json/assets.json').respond(200, '["AAPL US EQUITY"]');
$httpBackend.expect('GET', '/null/templates/dashboard.html').respond(200, '<html></html>');
done();
})
});
afterEach(function() {
$httpBackend.flush();
});
it('Basic Validation 1', function (done) {
FormulaValidator.promise.finally(function () {
console.log('FormulaValidator.spec.promise finally');
var p = FormulaValidator.validateFormula('MA(AAPL US EQUITY, 30)');
console.log('getFunctions: ' + FormulaValidator.getFunctions().length);
expect(p).toBe(true);
done();
});
scope.$apply();
//$rootScope.$digest();
});
答案 0 :(得分:1)
只有在您清空$httpBackend
时才能解析$ http承诺。
在afterEach()
中刷新它是为时已晚:刷新$httpBackend
的目的是告诉它:好的,现在你应该收到请求,发送回来以便我已经告诉你在致电$httpBackend.expect()
时发回的信息已经解决了承诺。
详细了解the doc。