2

特定の他のカスタム要素にアタッチされた直後に DOM をスキャンする要素 (ルーター - しかし、それは重要ではありません) を作成しています。エラーをスローする必要がある特定のケースがあり、これらをテストしたいと思います。

私が作成したテストは失敗していませんが、要素がアタッチされる前に、テストが既に失敗していることがわかります。それは物事の非同期的な性質だと思います。

これが問題のテストのスニペットです。問題のテスト フィクスチャには、「dom-change」イベントが発生した後に要素の 1 つが失敗する原因となる要素が含まれています (これにはリスナーがあります)。

    it('should fail if two route elements both designate thenselves as home', function(done) {
      var t= document.getElementById('multiple_home');
      function multiple () {
        t.create();
      }
      expect(multiple).to.throw(Error);
      t.restore();
      done();
    });

問題は、フィクスチャが複数で作成されているという事実に関連していると思いますが、複数の終了時までにまだ失敗していません。期待する Promise を渡すことができるかどうか疑問に思っていますが、複数を Promise に変換して試してみる方法がわかりません。

4

1 に答える 1

3

最終的に方法を見つけましたが、これをサポートするには、要素を少し計測する必要があります。

「作成された」コールバック要素で、Promise を作成し、2 つの関数を保存して解決し、「this」変数に拒否します。したがって、次のようになります。

this.statusPromise = new Promise(function(resolve,reject){
  this.statusResolver = resolve;
  this.statusRejector = reject;
}.bind(this));

DOM 解析セクションでは、このような try catch ブロックを使用します

try {
  //parse the dom throwing errors if anything bad happens
  this.statusResolver('Any useful value I like');
} catch (error) {
  this.statusRejector(error);
} 

次に、約束を返す関数を作成しました

domOK: function() {
  return this.statusPromise;
}

最後に、私のテストでは、このようなものをテストできるようになりました (テストごとに異なるフィクスチャを使用しているため、beforeEach ではなく各テストでフィクスチャをロードします。afterEach で再度クリアします)。Promise の .then および .catch 関数の使用に注意してください。

    it('should fail if two route elements declare the same path name',function(done){
      t = document.getElementById('multiple_path');
      t.create();
      r = document.getElementById('router')
      r.domOK().then(function(status){
        //We should not get here throw an error
        assert.fail('Did not error - status is: ' + status);
        done();
      }).catch(function(error){
        expect(error.message).to.equal('There are two nodes with the same name: /user');
        done();
      });
于 2015-11-14T09:11:12.337 に答える