5

Nel mio app.config sto utilizzando un servizio chiamato ui-router-extras FutureStates per creare dinamicamente gli stati dai risultati di una chiamata REST. Uno degli effetti collaterali di questo è che quando i miei test eseguiti, dal momento che sto caricando il mio modulo applicazione principale in tutti loro, tutti i test effettuare una chiamata a tale servizio e, quindi, tutte le prove falliscono con unMocking di richieste HTTP globali per tutte le suite in Angular e Jasmine

Error: Unexpected request: GET /api/v1/config 
No more request expected 

I può aggiungere quanto segue alle mie suite di test e risolve il problema, registrando questa chiamata con il backend in modo che si aspetti.

beforeEach(inject(function(_$httpBackend_){ 
    _$httpBackend_.whenGET(/\/api\/v1\/config.*/).respond([]); 
})); 

Il problema è che questo dovrebbe essere aggiunto ad ogni suite di test, che nella mia app modulare è un sacco di codice bagnato. Quello che sto cercando è un modo per definire questa aspettativa globalmente una volta per tutte i test (in un file globale karma, o mi accontenterò persino di un servizio/importazione su una riga da inserire nelle mie suite) o se il mio setup di prova o app.config è impostato in modo inefficiente per migliorarlo.

Quello che ho provato finora

// Defined in a tests-global.js file listed in my karma files array 
beforeEach(inject(function(_$httpBackend_){ 
    _$httpBackend_.whenGET(/\/api\/v1\/req_params.*/).respond([]); 
})); 

che non riesce con Error: Injector already created, can not register a module! poiché nei miei singoli suite di test che io chiamo beforeEach(module('x')); di utilizzare moduli che del modulo e non si può fare che dopo un inject().

Ho anche provato

// 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([]); 
}); 

che produce nessun errore in più, ma anche non risolve il problema Unexpected request.

C'è un modo per gestire le aspettative per tutti i test, o se questo è un segno che la mia struttura di test è impostata male, un modo per strutturare meglio il mio codice/test?

risposta

1

Quanto a me, non sto compreso il modulo principale di servizio, ma un mock per essa, qualcosa di simile (per quanto mi riguarda sto compreso all'interno karma.conf in "file"):

angular.module('some.service', []).service('MainService', function() { 
    this.APP_HOST = 'localhost'; 
    this.APP_PORT = 8000; 
}); 

Poi, all'interno di una prova in un beforeeach globale (ricordiamo che MainService è deriso uno, non un vero e proprio):

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

E definirà come deve essere preso in giro:

function mockHttpSuccessfulRequest() { 
    $httpBackend 
     .expectGET(baseUrl + '/api/surveys') 
     .respond({ 
      surveys: [{ 
       something: false, 
       date: '2015-03-11T08:28:58.765Z' 
      }] 
     }); 
} 

Allora si definisce questa finta prima di una prova costume:

beforeEach(mockHttpSuccessfulRequest);

E la si è liberi controllando tutto quello che volete.

Problemi correlati