2016-06-23 13 views
2

Mein Komponententest funktioniert aus irgendeinem Grund nicht mit der Funktion then. Hier ist der Testcode.Versprechen, dass nicht ausgelöst wird, wenn Karma + Jasmine + PhantomJs verwendet wird?

describe("Basic promise test",() => { 
    it("should trigger .then function",() => { 
     var mock = jasmine.createSpy('some method'); 
     var promise = new Promise((resolve, reject)=> { 
      console.log("inside Promise"); 
      resolve('something'); 
      console.log("done!"); 
     }); 
     promise.then(mock);   
     promise.then(function() { //neither works! 
      mock(); 
      console.log("resolved"); //code does reach here but only after test fails 
     }); 

     expect(mock).toHaveBeenCalled(); 
    }); 
}); 

Ich habe versucht, 'babel-polyfill' mit 'es6-Versprechen' und 'Versprechen-polyfill' ohne Erfolg. Was mache ich falsch?

Jsfiddle hierfür: https://jsfiddle.net/L53zxe39/

+0

Das Versprechen löst * asynchron * auf, daher müssen Sie Jasmins asynchrone Testfunktionen verwenden. Nach [diesem Artikel] (http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=Pr4UoAyeYCM) und [dies SO Antwort] (http://StackOverflow.com/a/16401978/157247), das beinhaltet 'runs' und' waitFor'. Ich würde es als Antwort posten, aber ich weiß nichts über Jasmin, vielleicht gibt es etwas Spezifischeres für Verheißungstests als 'runs' und' waistFor'. –

+0

@ T.J.Crowder finden Sie die JSfiddle hier: https://jsfiddle.net/L53zxe39/. Ich habe bereits versucht 'waitFor' zu benutzen, aber es wirft einen Fehler auf, weil ich Jasmine 2.0 benutze (ich denke, sie haben es entfernt) – supersan

+0

Ja, deshalb habe ich keine Antwort geschrieben, ich kenne Jasmine einfach nicht , konnte das Alter des Artikels nicht sagen, und die Antwort, die ich fand, war von 2013, bevor Versprechungen wirklich groß waren. Aber im Grunde ist das Problem, dass die Lösung asynchron ist, also muss Jasmin das wissen. Schauen Sie sich die Jasmine-Dokumentation an, um die vielversprechende API zu testen. –

Antwort

6

Das Versprechen ist gelöst, aber der then Rückruf erst im nächsten Mikrotaskanalysierer genannt wird, nach Check expect(mock).toHaveBeenCalled(); vorgenommen wurde.

Es ist Verhalten und entworfen, Mehrdeutigkeit um Versprechen zu verhindern. Ein .then Rückruf wird garantiert später aufgerufen, auch wenn das Versprechen bereits gelöst ist.

Asynchronous Jasmin Tests arbeiten auf folgende Weise:

describe("Basic promise test",() => { 
    it("should trigger .then function", (done) => { 
     var mock = jasmine.createSpy('some method'); 
     var promise = new Promise((resolve, reject)=> { 
      console.log("inside Promise"); 
      resolve('something'); 
      console.log("done!"); 
     }); 
     promise.then(mock).then(() => { 
      expect(mock).toHaveBeenCalled(); 
      done(); 
     }).catch(e => { 
      done.fail(e); 
     }); 
    }); 
}); 

Sie done.fail explizit verwenden können, um die Spezifikation fehl. Dies ist erforderlich, um Jasmin über nicht erfasste Ausnahmen während der Tests zu erfassen und zu benachrichtigen.

+0

danke für die antwort .. es funktioniert perfekt! – supersan