angularjs - unit - testing angular 2
Mocking solicitudes HTTP globales para todas las suites en Angular y Jasmine (1)
En mi app.config
estoy usando un servicio llamado ui-router-extras FutureStates para crear dinámicamente estados a partir de los resultados de una llamada REST. Uno de los efectos secundarios de esto es que cuando se ejecutan mis pruebas, dado que estoy cargando mi módulo de aplicación principal en todas ellas, todas las pruebas hacen una llamada a ese servicio y, por lo tanto, todas las pruebas fallan con un
Error: Unexpected request: GET /api/v1/config
No more request expected
Puedo agregar lo siguiente a mis suites de prueba y soluciona el problema, registrando esta llamada con el back-end, así lo espera.
beforeEach(inject(function(_$httpBackend_){
_$httpBackend_.whenGET(///api//v1//config.*/).respond([]);
}));
El problema es que esto debería agregarse a cada conjunto de pruebas, que en mi aplicación modular es un montón de código mojado. Lo que estoy buscando es una manera de definir esta expectativa globalmente una vez para todas las pruebas (ya sea en un archivo global de karma, o incluso me conformaría con una importación de servicio / una línea para colocar en mis suites) o si mi configuración de prueba o app.config
está configurado de manera ineficiente para mejorar eso.
Lo que he intentado hasta ahora
// Defined in a tests-global.js file listed in my karma files array
beforeEach(inject(function(_$httpBackend_){
_$httpBackend_.whenGET(///api//v1//req_params.*/).respond([]);
}));
que falla con Error: Injector already created, can not register a module!
ya que en mis suites de prueba individuales estoy llamando beforeEach(module(''x''));
para usar los módulos de ese módulo y no puedes hacer eso después de una inject()
.
También intenté
// Defined in a tests-global.js file listed in my karma files array
beforeEach(function() {
var $injector = angular.injector([''ngMock'']);
$httpBackend = $injector.get(''$httpBackend'');
$httpBackend.whenGET(///api//v1//req_params.*/).respond([]);
});
que no produce ningún error adicional, pero tampoco resuelve el problema de Unexpected request
.
¿Hay alguna manera de manejar las expectativas para todas las pruebas, o si esto es una señal de que mi estructura de prueba está configurada mal, una forma de estructurar mejor mi código / pruebas?
En cuanto a mí, no incluyo el módulo de servicio principal, sino un simulacro, algo así como (en cuanto a mí, lo incluyo dentro de karma.conf en "archivos"):
angular.module(''some.service'', []).service(''MainService'', function() {
this.APP_HOST = ''localhost'';
this.APP_PORT = 8000;
});
Luego, dentro de una prueba en un beforeEach global (recuerde que MainService es uno burlado, no real):
beforeEach(inject(function(_$httpBackend_, MainService, $rootScope, $controller) {
$httpBackend = _$httpBackend_;
MainService.APP_HOST = ''localhost'';
MainService.APP_PORT = ''8000'';
baseUrl = ''//'' + MainService.APP_HOST + '':'' + MainService.APP_PORT;
scope = $rootScope.$new();
someCtrl = $controller(''someCtrl'', {
$scope: scope,
MainService: MainService
});
}));
Y definirá CÓMO se debe burlar:
function mockHttpSuccessfulRequest() {
$httpBackend
.expectGET(baseUrl + ''/api/surveys'')
.respond({
surveys: [{
something: false,
date: ''2015-03-11T08:28:58.765Z''
}]
});
}
Entonces estás definiendo este simulacro antes de un juicio de prueba:
beforeEach(mockHttpSuccessfulRequest);
Y usted es libre de verificar todo lo que desea.