为什么最后一个()没有被执行?

时间:2017-09-29 01:50:14

标签: mocha es6-promise

我在testUtils.js中有以下代码:

var truncateTable = function (model, trx) {
    console.log(`Truncating ${model.prototype.tableName}`);
    return knex(model.prototype.tableName).transacting(trx).truncate();
};

utils = {
    /**
     * Database utility for cleaning up its tables
     */
    teardown: function () {
        return knex.transaction(function (trx) {
            return knex.raw('SET foreign_key_checks = 0;').transacting(trx)
                .then(() => {                    
                    return truncateTable(models.ProductAnomaly,trx)
                })
                .then(() => {
                    return truncateTable(models.Product, trx);
                })
                .then(() => {
                    return truncateTable(models.TaskListItem, trx);
                })
                .then(() => {
                    return truncateTable(models.TaskList, trx);
                })
                .then(() => {
                    return truncateTable(models.User, trx);
                })
                .then(() => {
                    console.log('TRUNCATE FINISHED');
                    return knex.raw('SET foreign_key_checks = 1;').transacting(trx);
                });
        });
    }
}

当我运行我的测试时,它会打印:

Truncating products_anomalies
Truncating products
Truncating tasklist_items
Truncating tasklists
Truncating users

但正如您可能会看到永远不会打印行"TRUNCATE FINISHED",即使对所有5个表执行了操作(截断)。为什么呢?

这是我的测试文件中的before方法:

   before((done) => {
        this.timeout(10000);

        testUtils.teardown()
            .then(() => {
                return testUtils.setup();
            })
            .then(() => {
                done();
            })
            .catch(err => console.log(JSON.stringify(err)));
    })

2 个答案:

答案 0 :(得分:0)

很可能是因为你的拆解功能中没有.catch,所以如果你的上一次truncateTable调用出现错误,你就永远不会知道没有捕获拒绝承诺。

尝试:

DateTimeFormatter

答案 1 :(得分:0)

我发现什么停止执行,截断序列和包含样本数据的时间超过2000毫秒,然后我不得不增加超时值。