2

我正在创建一个元素(路由器 - 但这并不重要),它在附加特定的其他自定义元素后立即扫描 DOM。在某些情况下,它需要引发错误,我想测试这些。

我构建的测试没有失败 - 但据我所知,在我的元素连接之前测试已经失败。我怀疑这是事物的异步性质。

这是相关测试的片段。有问题的测试夹具包含的元素会在“dom-change”事件发生(它有一个监听器)之后导致其中一个元素失败,然后它会扫描 dom 以查找其他内容。

    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 来期待 - 除了我不确定如何将 mulitple 变成一个 Promise 来尝试它。

4

1 回答 1

3

我最终找到了一种方法,但它需要对元素进行一些检测以支持这一点。

在元素“created”回调中,我创建了一个 Promise 并将两个函数存储在“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 回答