web-dev-qa-db-fra.com

Se moquer de $ httpBackend - comment gérer "une demande inattendue, plus de demande attendue"?

J'ai un test Jasmine codé comme ceci:

  it ("should send correct message to server to get data, and correctly set up scope when receiving it", function(){
    $httpBackend.when('GET', 'https://localhost:44300/api/projectconfiguration/12').respond(fakedDtoBase);
    $routeParams.projectId=fakeId; // user asks for editing project
    scope.$apply(function(){
        var controller=controllerToTest(); // so controller gets data when it is created
    });
    expect(scope.projectData).toEqual(fakedDtoBase);
});

et ça marche, mais je reçois l'erreur:

Error: Unexpected request: GET views/core/main/main.html
No more request expected
    at $httpBackend (C:/SVN/src/ClientApp/client/bower_components/angular-mocks/angular-mocks.js:1207:9)
    at sendReq (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7800:9)
    at $http.serverRequest (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7534:16)
    (more stack trace)....

Je me rends compte que je peux me moquer de tous les autres appels. Mais disons que je ne me soucie pas de ce que mon test veut charger car il peut appeler quelques autres choses. Comment puis-je m'assurer que toutes les autres demandes "se déroulent en silence", offrant peut-être une réponse factice unique pour tout le reste?

33
Askar Ibragimov

Votre test échoue car une demande est faite que vous n'avez pas spécifiée.

Essayez d'ajouter:

$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);

Bien sûr, vous devez également définir fakedMainResponse.

Veuillez également consulter la documentation (section Request Expectations vs Backend Definitions) qui dit:

Les attentes de demande fournissent un moyen de faire des affirmations sur les demandes faites par l'application et de définir des réponses pour ces demandes. Le test échouera si les demandes attendues ne sont pas faites ou si elles sont faites dans le mauvais ordre.

Le deuxième paramètre de $httpBackend.when est en fait un RegExp. Donc, si vous fournissez un RegExp qui correspondra à toutes les autres requêtes, cela devrait fonctionner.

47
PrimosK

Pour ceux qui utilisent httpBackend pour se moquer des appels http dans les tests EndToEnd ou qui se moquent simplement de tous les appels http pour l'application, la solution consiste à ajouter le code suivant dans la section de configuration de l'application (modifiez l'expression rationnelle en fonction de l'emplacement de votre modèle):

$httpBackend.whenGET(/^\/templates\//).passThrough();

Référence: https://docs.angularjs.org/api/ngMockE2E/service/ $ httpBackend

Testé avec angularjs 1.4 pour résoudre un problème similaire lors de l'intégration de ui-router

15
le0diaz

Je pense qu'il est également important de noter que si vous avez une $digest(), votre attente devrait suivre la $digest, ainsi:

_$rootScope_.$digest();
$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);
// ...
$httpBackend.flush(); // And remember to flush at the end
0
ecoologic