JS简单断言函数

2017-03-14  本文已影响0人  roylai

JS简单断言函数

示例HTML


<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="result"></div>
</body>
</html>

直接上函数

(function () {
    var queue = [], paused = false, results;
    this.test = function (name, fn) {
        // 封装任务送入队列
        // 任务主要做的事情为每个test加一个ul,方便插入断言语句
        queue.push(function () {
            results = document.getElementById('results');
            results = assert(true, name).appendChild(
                document.createElement('ul')
            );
            fn();
        });

        // 测试剩余任务
        runTest();
    };
    
    // 暂停函数
    this.pause = function () {
        paused = true;
    };

    // 异步完成后继续任务队列
    this.resume = function () {
        paused = false;
        setTimeout(runTest, 1);
    };

    // 调控任务函数
    function runTest() {

        // 异步断言过程:先pause()标记暂停,这时异步操作进行,等异步操作执行完毕后回调函数出发resume()函数,标记非暂停runtest下一个任务。

        // 如果任务处于非暂停状态,且仍有剩余任务
        if (!paused && queue.length) {

            // FIFO出一个任务,并且执行
            queue.shift()();
            
            // 同步测试兼容
            if (!paused) {
                resume();
            }
        }
    }
    this.assert = function assert(value, desc) {
        var li = document.createElement('li');
        li.className = value ? "pass" : "fail";
        li.appendChild(document.createTextNode(desc));
        results.appendChild(li);
        if (!value) {
            li.parentNode.parentNode.className = "fail";
        }
        return li;
    }
})();

window.onload = function () {
    test('async test #1', function () {
        pause();
        setTimeout(function(){
            assert(true,"First test completed");
            resume();
        },1000)
    });
    test('async test #2', function(){
        pause();
        setTimeout(function(){
            assert(true,"second test completed");
            resume();
        },1000)
    });
}

上一篇下一篇

猜你喜欢

热点阅读