2016-06-22 12 views
3

を投げていない私は、この機能を持っている:ジャスミン:どのように約束ハンドラを期待する例外

reload() { 
    myService.queryData() 
     .done(...) 
     .always(() => throw "fake exception"); //just to simulate the failure 
} 

私は私のテストリロード機能をしたいと、それは例外もコールバックがない約束をスローしないようにしてください。

describe("reload", function() { 
    it("does not throw exception", function (done) { 

     spyOn(myService, "queryData").and.callFake(() => { 
      let deffered = $.deffered(); 
      setTimeOut(() => deffered.reject(), 0) 
      return deffered.promise(); 
     }); 

     reload(); 
     setTimeout(() => { 
      //this is evaluated after the exception has been thrown, but 
      //how to check whether exception has been thrown 
     }, 2); 
    }); 
}); 

編集:私は、関数の戻り値の型がすでに定義されているいくつかのケースで約束、例えば、コンポーネントのライフサイクルイベントを返すことができない場合があります。

MyComponent extends React.Component { 
    componentDidMount() { 
     this.load(
      galleryService.nodes().then(galleryResult => this.setState({ nodes: galleryResult.nodes })) 
     ); 
     this.load(
      galleryService.caches().then(cachesResult => this.setState({ caches: cachesResult.caches })) 
     ); 
    } 
} 

var myComponent = React.createElement(MyComponent); 
TestUtils.renderIntoDocument(myComponent); //this triggers the componentDidMount event and I need to make sure it won't throw error. 
+0

あなたはあなたの編集スニペットの流れを調整するために、 'Promise.all'または' Promise.race'を使用することはできませんか? – MarcoL

+0

私はできましたが、componentDidMountはvoidを返す関数としてフレームワーク(REACT)によって定義されており、直接呼び出すことはありません。 'TestUtils.renderIntoDocument(...)'を実行すると、フレームワークによって呼び出されます。私はバニラのjavascriptに問題を分けることができると期待していましたが、私は問題を正しく定式化できませんでした... – Liero

+0

'promise.all'を返すことはできません。なぜなら、' configDidMount関連するコードを 'componentDidMount'から呼び出す別のテスト可能な関数に分解します。 –

答えて

0

私はwindow.onerrorをスパイすることは進むべき道であると信じています:

describe("reload", function() { 
    it("does not throw an exception", function (done) { 

      spyOn(window, 'onerror').and.callFake((error: any, e: any) => { 
       fail(error); 
      }); 

      spyOn(myService, "queryData").and.callFake(() => { 
       let deffered = $.deffered(); 
       setTimeout(deffered.reject, 0); 
       return deffered.promise(); 
      }); 
     }); 
     setTimeout(done, 2); 
    }); 
}); 
3

レッツは約束を返すreloadそれが作成されます。その後に関連する部分をくくり出すあなたは、元の関数の戻り値を変更することができない場合は、次の質問の後

reload().catch(err => done.fail(err)); 

Updateが編集されました:あなたのテストケースでは、テストの失敗をトリガーすることにcatchハンドラをアタッチ別々の機能。たとえば:

function reloadNodes() { 
    return somePromise(); 
} 

function reloadCaches() { 
    return anotherPromise(); 
} 

function reload() { 
    reloadNodes(); 
    reloadCaches(); 
} 

あなたは、代わりにreloadreloadNodesreloadCachesをテストすることができます。明らかに、約束ごとに別々の関数を作成する必要はなく、適切な場合はPromise.allのようなものを使用して約束を組み合わせることができます。

+0

それは私がやったやり方だが、約束を返すことはいつも可能ではない、私の編集を参照してください。 – Liero

+0

@Liero私の更新を参照してください –

+0

これは私の元の質問に答えるので、私は後で答えとして受け入れますが、実際には私の問題を解決するものではありません。私はそれが不十分だと認めている – Liero

関連する問題