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.