7

概述

在 中动态渲染的 DOM 元素似乎是异步渲染的dom-ifdom-repeat <templates>因此使单元测试有点痛苦。


聚合物成分

template(is='dom-if', if='{{!defaultPrintAll}}')
  template(is='dom-repeat', items='{{_pageBucketItems}}')
    button(type='button', class$='{{_computeDefaultClass(item)}}', on-tap='_togglePageClick') {{item}}

考试

  test("Clicking 'Export All' to off, reveals board-selection tiles", function() {
    $("#export-pdf-checkbox-all").siblings(".checkbox").trigger("click");
    Polymer.dom.flush()
    expect($(".board-range__button")).to.be.visible;
  });

为什么它似乎失败:

单击触发dom-if/dom-repeat的按钮时,元素不会以同步顺序呈现。

  • 并且dom-if它是异步的后续/嵌套dom-repeat渲染。

  • 更糟糕的是,它button本身以计算/绑定的方式获取它的类(请注意class$=button

所以问题归结为:

在我模拟单击激活所有 3 个条件的按钮后,是否可以强制以同步顺序呈现类的dom-ifdom-repeat和计算绑定?


笔记:

  • 我使用 Polymer 的官方 WCT 作为测试工具。
  • 我也在使用 chai-jquery。
  • 我也用过Polymer.dom.flush(),但还是不行,咳咳。。
  • 我知道我可以改用chai-as-promised.js它,但它为我的测试增加了不必要的复杂性,因为这样的小事,所以我想避免它。
4

1 回答 1

8

与其使用 ,不如Polymer.dom.flush()尝试使用flushWCT 放在窗口上的功能。理论上,这将在模板渲染后将要执行的回调函数排入队列。

test("Clicking 'Export All' to off, reveals board-selection tiles", function(done) {
    $("#export-pdf-checkbox-all").siblings(".checkbox").trigger("click");
    flush(function () {
        expect($(".board-range__button")).to.be.visible;
        done();
    }
});

需要注意的重要一点:异步测试需要将 done 函数传递到测试回调中,并且需要在评估条件后调用 done。

于 2015-12-30T05:26:27.403 回答