2016-08-12 3 views
1

Ich versuche, ein Versprechen in einer separaten Bibliothek zu testen, die ich in meine App injiziert habe.So führen Sie Promise-Test in Jasmine

function myFunc(input) { 
 
     return new Promise(function(resolve, reject) { 
 
      ··· 
 
      resolve(value); // success 
 
      ··· 
 
      reject(error); // failure 
 
     }); 
 
    };

Dies ist meine Funktion, die ein Versprechen zurück.

Ich würde ernsthaft lieben den Test in Jasmin wie diese

describe('Service: myService', function() { 
 
    var $log; 
 

 
beforeEach(inject(function (_$log_) { 
 
    $log = _$log_; 
 
})); 
 

 
it('should get results', function() { 
 
    $log.log("start test"); 
 

 
    var self = this; 
 
    myFunc(input).then(function(response) { 
 
      $log.log("success"); 
 
      expect(response).toBe("response"); 
 
      done(); 
 
    }).catch(function(error) { 
 
      $log.log("fail"); 
 
      self.fail(error); 
 
      done(); 
 
    }); 
 
    $log.log("end test"); 
 
}); 
 
});

Mein Test bestanden wird (nicht zu erwarten.) Und das einzige, was in meinem Protokoll wird [Test starten] und laufen [Test beenden], als ob das Versprechen vollständig ignoriert wird. Da ich nicht $ q für das Versprechen verwende, scheinen die meisten Jasmin Tipps eckig nicht hilfreich zu sein.

Irgendwelche Ideen, wie man in dieses "dann" kommt?

Dank

Antwort

0

Ich könnte hier falsch sein, aber das ist sehr wahrscheinlich, weil Sie hier einen asynchronen Prozess zu testen versuchen. Was im Wesentlichen passiert, ist, dass Sie die Funktion aufrufen, aber der Test läuft weiter und endet, bevor das Versprechen zurückkehrt, weshalb der Test erfolgreich ist.

Ein Weg, um dies zu umgehen (das ist eher wie ein Hack, ich bin mir sicher, es gibt einen besseren Weg, dies zu tun, und wenn ich es finde, werde ich diesen Beitrag bearbeiten) ist, diesen Code hinzuzufügen am Ende des Tests:

describe("baseline test",function(){ 
    it("baseline",function(done){ 
     setTimeout(function(){ 
      expect(1).toEqual(1); 
      done(); 
     },1000);  
    }); 
}); 

im Wesentlichen diese Schnipsel was tun ist nur einen Timeout, die für jeden asynchronen für 1 Sekunde warten Anrufe zurückrufen. Wenn 1 Sekunde nicht genug ist, können Sie immer diese 1000 (in Millisekunden) erhöhen. Wenn dies nicht funktioniert, prüfen Sie möglicherweise, ob Sie eine weitere Testsuite hinzufügen möchten, die erst abgeschlossen wird, wenn die Versprechen zurückkommen.

+0

Danke. Ich habe das versucht, aber jetzt bekomme ich einen Timeout-Fehler. Ich denke der Thread geht irgendwie verloren. Immer noch herausfinden. – Jade