编程语言
首页 > 编程语言> > javascript – 如何检查多个chai-http请求何时在块中的mocha中完成?

javascript – 如何检查多个chai-http请求何时在块中的mocha中完成?

作者:互联网

我在一组mocha单元测试中使用了一个前块,在其中我正在迭代一组调用以从REST API获取信息.我正在使用chai-http来做到这一点.但是我遇到的问题是,在我完成的一系列n个请求完成之前,调用了done()方法.在结束块中调用完成会导致多个done()调用,但是在块外部意味着在我完成之前调用它!这是一个前块的例子:

var flags = [];
var groups = [];

// This functions correctly 1 done() called at the end
before(function(done) {
    chai.request(server)
        .get('/groups')
        .end(function(err, res){
             groups = JSON.parse(res.text);
             done();
        });
    });

before(function(done) {
    groups.forEach(function(rec) {
        chai.request(server)
            .get('/groups/' + rec.KEYWORD_GROUP_ID + '/groupflags')
            .end(function(res, err) {
                Array.prototype.push.apply(flags, JSON.parse(res.text));
                // A done() here gets called n times
                });
        // But here it's called before the requests all end
        done();
        });

有没有办法检测所有这些请求何时完成,然后我可以调用一个done()来确保我的测试只在正确的上下文设置下执行?

解决方法:

您可以尝试使用async.whilst().计算groups.length的计数器,然后在回调中点击done().链接到功能文档:(http://caolan.github.io/async/docs.html#whilst)

就像是…

let counter = 0;
async.whilst(
    () => {
        // Test if we have processed all records
        return counter < groups.length;
    },
    (callback) => {
        let rec = groups[counter++]; // Sorry Douglas
        chai.request(server)
            .get('/groups/' + rec.KEYWORD_GROUP_ID + '/groupflags')
            .end(function (res, err) {
                Array.prototype.push.apply(flags, JSON.parse(res.text));
                callback(null, counter);
            });
    },
    (err) => {
        assert(!err, err);
        done();
    }
);

标签:chai,javascript,unit-testing,mocha,chai-http
来源: https://codeday.me/bug/20190828/1752599.html