5

In meinem app.config Ich verwende einen Service namens ui-router-extras FutureStates, um dynamisch aus den Ergebnissen eines REST-Aufrufs Staaten zu erstellen. Eine der Nebenwirkungen ist, dass, wenn meine Tests ausführen, da ich in sie alle meine Haupt-App-Modul bin Laden, alle Tests einen Anruf zu diesem Dienst zu machen und damit alle Tests fehlschlagen mit einemMocking globale HTTP-Anfragen für alle Suiten in Angular und Jasmine

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

I kann zu meinen Testsuiten folgendes hinzufügen und behebt das Problem, indem er diesen Aufruf mit dem Backend registriert, so dass er es erwartet.

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

Das Problem ist, dass diese zu jeder Testsuite hinzugefügt werden müssten, die in meinem modularen app viel nasser Code. Was ich suche, ist entweder eine Möglichkeit, diese Erwartung global einmal für alle Tests zu definieren (entweder in einer globalen Karma-Datei, oder ich würde mich sogar mit einem Service/einzeiligen Import in meinen Suiten begnügen) oder Wenn mein Test-Setup oder app.config ineffizient eingerichtet ist, um das zu verbessern.

Was ich versucht habe bisher

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

die seit in meinen individuellen Testsuiten mit Error: Injector already created, can not register a module! versagt ich beforeEach(module('x')); nenne dieses Moduls der Module zu verwenden, und Sie können nicht tun, dass nach einem inject().

Ich habe auch versucht,

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

, die keine zusätzlichen Fehler produziert, aber auch nicht das Unexpected request Problem nicht lösen.

Gibt es eine Möglichkeit, für alle Tests zu erwarten, oder wenn dies ein Zeichen dafür ist, dass meine Teststruktur schlecht eingerichtet ist, eine Möglichkeit, meinen Code/Tests besser zu strukturieren?

Antwort

1

Was mich betrifft, ich bin der Hauptservicemodul nicht einschließlich, aber ein Mock für sie, so etwas wie (wie bei mir, dass ich es in karma.conf in „Dateien“ bin auch):

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

Dann in einem Test in einem globalen before (denken sie daran, dass MainService ein ein verspottet, kein 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 
    }); 
})); 

Und wird festgelegt, wie es verspottet werden soll:

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

dann definieren Sie diese Mock vor einem Test Anzug:

beforeEach(mockHttpSuccessfulRequest);

Und die Sie frei sind prüft alles, was Sie wollen.

Verwandte Themen