Unit-testing mit AngularJS $httpBackend gibt "Fehler: Unerwartete Anfrage"
Ich bin gonna Vorwort diese Frage, indem Sie sagen: ich habe schon einmal einen test auf der Arbeit für mein "LoginCtrl" erfüllt fast die gleiche Aufgabe. Ich bin sicher, dies ist eine Frage, die etwas wirklich kleinen habe ich übersehen. Vielen Dank im Voraus für jede Hilfe 🙂
Ich habe eingestellt, dass der erwartete Wert/Antwort für httpBackend
für meinen test, aber wenn ich httpBackend.flush()
es ist, als wenn ich nie die Erwartung.
Testen von code:
describe('user register', function () {
var scope, RegisterCtrl, httpBackend, userJohnDoe, userJohnDoeRegistered, Restangular;
//TEST
beforeEach(module('LR.User.Register'));
describe('RegisterCtrl', function () {
beforeEach(inject(function ($controller, _$httpBackend_, $rootScope, _Restangular_, $state) {
scope = $rootScope.$new();
httpBackend = _$httpBackend_;
Restangular = _Restangular_;
//Models
userJohnDoeRegistered = {
"access_token": "YzEyZDhjNjBlY2EwMTMxMmQzZGIzYWY5NDY4OGYwMjMzMGVjNDU3MDVhY2U0YjJmNDc1ODI3NWU0ODkzZGNkMQ",
"expires_in": 7200,
"token_type": "bearer",
"scope": null,
"refresh_token": "MmFhMTQ5NzU4ODI5ZjE2Mjk3ZjNlYzEwYzJkMjc4M2NkZjY2MjVkMjIwNWQzODUxYWNiYzY3NzIyMzEwYzJhNg",
"user": {
"username": "johndoe",
"email": "[email protected]",
"id": 1,
"first_name": "John",
"middle_name": "f",
"last_name": "Doe",
"created": "2013-09-04T10:46:10-0500",
"updated": "2013-09-04T10:46:10-0500"
},
"status": "success",
"status_code": 200,
"status_text": "OK"
};
userJohnDoe = {
"email": "[email protected]",
"first_name": "John",
"middle_name": "f",
"last_name": "Doe",
password: 'test123X',
passwordSecond: 'test123X',
client_id: '1_3b5zgimwg4kkko4wksk4sw0o48040o8ws8og8kg4wsowwkc44s'
};
httpBackend.whenPOST('/register', userJohnDoe).respond(userJohnDoeRegistered);
RegisterCtrl = $controller('RegisterCtrl', {$scope: scope, $state: $state, Restangular: Restangular});
}));
afterEach(function () {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
it('should be able to register a fake user', inject(function () {
var resolvedRegistration;
var cb = function (response) {
//Expect the userJohnDoe object
resolvedRegistration = sanitizeRestangularOne(response);
console.log(logTestHeader('REGISTRATION RESPONSE') +
JSON.stringify(resolvedRegistration, null, ' '));
};
//Set credentials
scope.user = userJohnDoeCredentials;
//Call login
var register = scope.register_user().then(function() {
cb();
});
scope.$digest();
httpBackend.flush();
expect(resolvedRegistration).toEqual(userJohnDoeRegistered);
}));
});
});
Ausgabe Antwort:
Chrome 29.0.1547 (Mac OS X 10.8.4) user register RegisterCtrl should be able to register a fake user FAILED
Error: Unexpected request: POST /register
No more request expected
at Error (<anonymous>)
at $httpBackend (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:959:9)
at y (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:64:282)
at g (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:62:272)
at r (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140)
at r (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140)
at /Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:97:293
at Object.g.$eval (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:104:502)
at Object.g.$digest (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:102:419)
at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:74:19)
Error: Declaration Location
at window.jasmine.window.inject.angular.mock.inject (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:1781:25)
at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:57:54)
at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:9:5)
at /Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:1:1
Herausgefunden, das problem, siehe meine Antwort für die info.
InformationsquelleAutor robert.bo.roth | 2013-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mein Erster Gedanke ist, dass etwas zu machen ist eine Anforderung, wenn Sie instanziieren Sie Ihren controller. Vielleicht versuchen Sie, hinzufügen von $httpBackend.flush() nach dem controller-Deklaration Linie und sehen, ob das löst es. Auch, sollten Sie Ihre $scope.$verdauen sein, nach dem $httpBackend.Spülen Sie stattdessen vor?
flush()
rufen Sie rund um, aber immer wenn es heißt, bevordigest()
bekomme ich ein "Keine ausstehende Anfrage zu Spülen!" - Fehler. Es scheint mir, wie meinhttpBackend.whenPOST
Erklärung nicht feuern, aus welchem Grund auch immerStandardmäßig mein controller ruft eine request-Methode, die ist, was verursacht wurde dieses Problem für mich.
InformationsquelleAutor MBielski
Fand ich heraus, was es war. meine
register_user()
Funktion verweist$scope.user
, die auf eine nicht definierte variable:userJohnDoeCredentials
(einer anderen variable Namen, die ich verwendet hatte für meinen vorherigen test).Nicht sicher, warum meine IDE war nicht beschwert Referenzierung einer undefinierten Variablen, und es war vorbei, alle meine jslint-tests, also das ist seltsam, auch, aber meh. Es ist behoben 😀 Nur wenn ich jetzt bekommen könnte, die mock-Anfrage zurückgeben, was ich will es...
InformationsquelleAutor robert.bo.roth