nicht aufgerufen zu werden Ich teste eine eckige Service-Methode mit $ httpBackend und versuche, verschiedene Antworten basierend auf den Anfragedaten zu verspotten. Das Problem ist, wenn ich den Fehlerstatus sende, wenn die Anfrage ungültig ist, ruft sie immer noch den Erfolgsrückruf der $ http-Methode auf, daher kann ich die Fehlersituation nicht testen. Unten ist der Service:
app.service('dataService', function($http) {
var self = this;
this.getData = function (request) {
return $http({
method: 'POST',
url: 'https://some-url/',
data: request
}).then(function successCallback(response) {
self.valid = true;
self.data = response.data;
}, function errorCallback(response) {
self.valid = false
});
};
});
und unten ist der Testcode:
describe('.getData()', function() {
beforeEach(inject(function(_dataService_, _$httpBackend_) {
var dataService = _dataService_,
$httpBackend = _$httpBackend_;
$httpBackend.when('POST', 'http://some-url/', 'valid request')
.respond(200, 'data');
$httpBackend.when('POST', 'http://some-url/', 'invalid request')
.respond(500, '');
}));
// runs successfully
it('should store data correctly', function() {
dataService.getData('valid request').then(
function success(){
expect(dataService.data).toEqual('data');
}
);
$httpBackend.flush();
});
// TypeError: Cannot read property 'data' of undefined
// This error comes in service at successCallBack() line "self.data = response.data;"
it('should result in error if any', function() {
dataService.getData('invalid request').then(
function success(){
expect(dataService.valid).toEqual(false);
}
);
$httpBackend.flush();
});
});
Wie ich analysiert, dies wegen der HTTP responseError Interceptor geschieht. Wenn ich den Interceptor entferne, funktioniert der Testcode einwandfrei (Erfolgs- und Fehlerrückrufe werden basierend auf dem Antwortstatus korrekt aufgerufen). Aber sobald ich responseError
Interceptor verwende, "verschluckt" es den Fehler und verursacht successCallback()
aufgerufen werden, und setzt response
als undefined
innerhalb des Erfolgs Callback.
Was ist die Lösung in diesem Fall? Wie können wir in diesem Fall Erfolgs- und Fehlersituationen testen?