2

私の単体テストは何らかの理由でthen関数に当てられていません。ここにテストコードがあります。Promise。その後、Karma + Jasmine + PhantomJを使用しているときにトリガーしませんか?

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

私は「ES6-約束」と無駄に「約束-ポリフィル」、「バベル-ポリフィル」を使ってみました。私は間違って何をしていますか?

このためJsfiddle:https://jsfiddle.net/L53zxe39/

+0

プロミスは* asynchronously *を解決するので、ジャスミンの非同期テスト機能を使用する必要があります。 [この記事](http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methodsusing-the-jasmine-runs-and-waitfor-methods.html#fbid=Pr4UoAyeYCM)と[this SO答え](http://stackoverflow.com/a/16401978/157247)で、 'runs'と' waitsFor'を使用します。私は答えとして投稿したいと思いますが、ジャスミンについては何も知りません。約束するテストは、「実行する」と「待つ」よりも具体的なものかもしれません。 –

+0

@ T.J.Crowderここのjsfiddle:https://jsfiddle.net/L53zxe39/をご覧ください。私はすでに 'waitsFor'を使ってみましたが、Jasmine 2.0を使用しているのでエラーが発生します(削除したと思います) – supersan

+0

ええ、私は答えを投稿しなかったので、ジャスミンは分かりません記事の時代を伝えることができず、私が見つけた答えは、約束が本当に大きくなる前の2013年からのものでした。しかし根本的には、解像度は非同期であるため、ジャスミンはそれを知る必要があります。だから、ジャスミンのドキュメントを見て、現在の約束ベースのAPIをテストする方法を調べてください。 –

答えて

6

約束が解決されていますが、thenコールバックはチェックのみexpect(mock).toHaveBeenCalled();が行われた後、次のマイクロタスクで呼ばれています。

これは動作を意図しており、約束のあいまいさを防ぐために設計されています。 .thenコールバックは、約束がすでに解決されていても、後で呼び出されることが保証されています。

非同期ジャスミンテストは、次のように動作:

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

あなたが明示的にスペックを失敗するdone.failを使用することができます。これは、テスト中にキャッチされ、キャッチされていない例外についてジャスミンに通知するために必要です。

+0

答えに感謝..それは完璧に動作しています! – supersan

関連する問題