2016-07-13 11 views
0

Ich fand mich in einem kleinen Callback-Hölle und fand es schwierig zu testen. Ich hoffe, vielleicht einige von euch mir helfen könnte dies herauszufindenWinkelprüfung Tests verspricht

Ich habe 2 Dienste und mein Problem ist mit der fooService.getModel Funktion

app.service('fooService', function($q, barService){ 
    return { 
    getModel: function(){ 
     var deferred = $q.defer(); 
     barService.get().then(function(response){ 
     //my bareService mock allow me to reach up to this point 
     var result = {}; 
     //some processing logic (if, else, etc) 
     console.log('resolve result') // I totally see this log 
     deferred.resolve(result); //this is what i want to test 
     }); 
     return deferred.promise; 
    }, 
    process: function(){ 
     this.getModel().then(function(result){ 
     if(result.success){ 
      barService.post().then(function(){ 
       //whatever i dont care 
      }) 
     } 
     }); 
    } 
    } 
}); 

und Barservice, die zwei Methoden enthalten (erhalten und zu speichern) im Grunde $ http Anrufe.
für bar service ich habe keine probleme testen, weil die logik ist isoliert Ich fälsche nur die $ httpBackend Anrufe, mit unterschiedlichen Antworten.

Das Problem, das ich gefunden habe, wenn ich das Ergebnisobjekt überprüfen möchte zurückgegeben auf getModel Funktion.

mein Test ist so etwas wie

it('should test the returning model', inject(function(fooService){ 
    barService.get.and.returnValue({then: function(successCallback){ 
     successCallback({status:204, data: {}}); 
    }}); 

    var result; 
    fooService.getModel().then(function(response){ 
     console.log('unit test then') // never gets in here 
     result = response; 
    }); 

    //or anything related to the result object 
    expect(result).toEqual(mockedModel); 
    expect(result.success).toBeTruthy() 
}) 

, was ich habe das wird ausgeführt, wenn meine getModel Funktion der HTTP-Aufruf selbst gesehen ist, ich das Ergebnis in meinem Unit-Test auswerten kann.

so etwas wie

getModel: function() { 
    var deferred = $q.defer(); 

    $http.get(url).then(function (response) { 
     deferred.resolve(response); 
    }) 
    .catch(function (response) { 
     deferred.reject(response); 
    }); 

    return deferred.promise; 
} 

würde ich auf jeden Fall lieben die Funktionalität meiner Barservice meiner fooService zu extrahieren, aber das ist sehr wahrscheinlich, rehusable zu sein, dass, warum ich zu einem separaten Dienst extrahiert.

Haben Sie eine Idee, wie kann ich meinen Komponententest reparieren, um die Ergebnisantwort zu bewerten?

i Dank für die Hilfe Jungs

Antwort

0

machen nichts gefunden seinen klaren hoffe, dass ich es sogar ein Dienst ist, ich brauche $ scope.digest in meinem Unit-Test zu tun.

danke!