unit tutorial test run karma and angularjs jasmine karma-runner

angularjs - tutorial - Burlarse de $ httpBackend: cómo manejar "Solicitud inesperada, no se espera más solicitud".



karma jasmine tutorial (3)

Tengo una prueba de jazmín que está codificada de esta manera:

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); });

y funciona, pero obtengo el error:

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)....

Me doy cuenta de que puedo burlarme de cualquier otra llamada. Pero digamos que no me importa qué más mi prueba quiera cargar, ya que puede llamar a algunas otras cosas. ¿Cómo puedo asegurarme de que todas las demás solicitudes simplemente "suceden silenciosamente", tal vez ofreciendo una sola respuesta fingida para todo lo demás?


Creo que también es importante darse cuenta de que si tiene un $digest() , su expectativa debe seguir el $digest , así:

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


Para aquellos que usan httpBackend para burlarse de llamadas http en EndToEnd tests o simplemente burlarse de todas las llamadas http para la aplicación, la solución es agregar el siguiente código en la sección de configuración de la aplicación (cambiar la expresión regular de acuerdo con la ubicación de su plantilla):

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

Referencia: https://docs.angularjs.org/api/ngMockE2E/service/ $ httpBackend

Probado con angularjs 1.4 para solucionar un problema similar al integrar el enrutador ui


Su prueba falla porque se realizó una solicitud que no ha especificado.

Intenta añadir:

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

Por supuesto, también debe definir fakedMainResponse .

Consulte también la documentation (sección Expectativas de solicitud frente a definiciones de back-end) que dice:

Las expectativas de solicitud proporcionan una forma de hacer afirmaciones sobre solicitudes hechas por la aplicación y definir respuestas para esas solicitudes. La prueba fallará si las solicitudes esperadas no se realizan o si se realizan en el orden incorrecto.

El segundo parámetro de $httpBackend.when es realmente un RegExp . Entonces, si proporciona un RegExp que coincidirá con todas las demás solicitudes, debería funcionar.