fix(ngMock): pass failed HTTP expectations to $exceptionHandler

This was only partially fixed in f18dd2957.

Closes #16644
This commit is contained in:
Georgii Dolzhykov
2018-07-24 19:45:29 +03:00
committed by George Kalpakas
parent 864c7f00c4
commit ebeb1c9491
2 changed files with 74 additions and 14 deletions
+20 -14
View File
@@ -1511,16 +1511,25 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
}
}
function createFatalError(message) {
var error = new Error(message);
// In addition to being converted to a rejection, these errors also need to be passed to
// the $exceptionHandler and be rethrown (so that the test fails).
error.$$passToExceptionHandler = true;
return error;
}
if (expectation && expectation.match(method, url)) {
if (!expectation.matchData(data)) {
throw new Error('Expected ' + expectation + ' with different data\n' +
'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data);
throw createFatalError('Expected ' + expectation + ' with different data\n' +
'EXPECTED: ' + prettyPrint(expectation.data) + '\n' +
'GOT: ' + data);
}
if (!expectation.matchHeaders(headers)) {
throw new Error('Expected ' + expectation + ' with different headers\n' +
'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' +
prettyPrint(headers));
throw createFatalError('Expected ' + expectation + ' with different headers\n' +
'EXPECTED: ' + prettyPrint(expectation.headers) + '\n' +
'GOT: ' + prettyPrint(headers));
}
expectations.shift();
@@ -1541,20 +1550,17 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
($browser ? $browser.defer : responsesPush)(wrapResponse(definition));
} else if (definition.passThrough) {
originalHttpBackend(method, url, data, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers);
} else throw new Error('No response defined !');
} else throw createFatalError('No response defined !');
return;
}
}
var error = wasExpected ?
new Error('No response defined !') :
new Error('Unexpected request: ' + method + ' ' + url + '\n' +
(expectation ? 'Expected ' + expectation : 'No more request expected'));
// In addition to be being converted to a rejection, this error also needs to be passed to
// the $exceptionHandler and be rethrown (so that the test fails).
error.$$passToExceptionHandler = true;
if (wasExpected) {
throw createFatalError('No response defined !');
}
throw error;
throw createFatalError('Unexpected request: ' + method + ' ' + url + '\n' +
(expectation ? 'Expected ' + expectation : 'No more request expected'));
}
/**
+54
View File
@@ -1506,6 +1506,42 @@ describe('ngMock', function() {
});
it('should throw error when expectation fails', function() {
expect(function() {
hb.expectPOST('/some', {foo: 1}).respond({});
hb('POST', '/some', {foo: 2}, callback);
hb.flush();
}).toThrowError(/^Expected POST \/some with different data/);
});
it('should throw error when expectation about headers fails', function() {
expect(function() {
hb.expectPOST('/some', {foo: 1}, {X: 'val1'}).respond({});
hb('POST', '/some', {foo: 1}, callback, {X: 'val2'});
hb.flush();
}).toThrowError(/^Expected POST \/some with different headers/);
});
it('should throw error about data when expectations about both data and headers fail', function() {
expect(function() {
hb.expectPOST('/some', {foo: 1}, {X: 'val1'}).respond({});
hb('POST', '/some', {foo: 2}, callback, {X: 'val2'});
hb.flush();
}).toThrowError(/^Expected POST \/some with different data/);
});
it('should throw error when response is not defined for a backend definition', function() {
expect(function() {
hb.whenGET('/some'); // no .respond(...) !
hb('GET', '/some', null, callback);
hb.flush();
}).toThrowError('No response defined !');
});
it('should match headers if specified', function() {
hb.when('GET', '/url', null, {'X': 'val1'}).respond(201, 'content1');
hb.when('GET', '/url', null, {'X': 'val2'}).respond(202, 'content2');
@@ -2833,6 +2869,24 @@ describe('ngMockE2E', function() {
}).toThrowError('Unexpected request: GET /some\nNo more request expected');
});
it('should throw error when expectation fails - without error callback', function() {
expect(function() {
hb.expectPOST('/some', { foo: 1 }).respond({});
$http.post('/some', { foo: 2 }).then(noop);
hb.flush();
}).toThrowError(/^Expected POST \/some with different data/);
});
it('should throw error when unexpected request - with error callback', function() {
expect(function() {
hb.expectPOST('/some', { foo: 1 }).respond({});
$http.post('/some', { foo: 2 }).then(noop, noop);
hb.flush();
}).toThrowError(/^Expected POST \/some with different data/);
});
describe('passThrough()', function() {
it('should delegate requests to the real backend when passThrough is invoked', function() {