javascript - 如何检查多个 chai-http 请求何时真正在 block 之前的 mocha 中完成?

标签 javascript unit-testing mocha.js chai chai-http

我在一组 mocha 单元测试中使用了一个 before block ,并在其中迭代了一组调用以从 REST API 获取信息。我正在使用 chai-http 来执行此操作。但是,我遇到了在我发出的一系列 n 请求完成之前调用 done() 方法的问题。在结束 block 中调用 done 会导致多个 done() 调用,但放在 block 外意味着它在我真正完成之前被调用!这是一个 before block 的示例:

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();
    }
);

关于javascript - 如何检查多个 chai-http 请求何时真正在 block 之前的 mocha 中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43533482/

相关文章:

javascript - 为什么删除元素比添加元素花费更多时间?

javascript - 使用 Chrome native 消息传递触发时批处理文件不提示用户输入

javascript - Colorbox 灯箱中按钮上的 HTML/JavaScript 工具提示

node.js - 在带有 supertest 的 Mocha 断言中使用异步等待函数

javascript - 在我的浏览器中加载后如何从我的本地机器测试网页

javascript - 如何使用 Jasmine 为 Angular.js 的服务和 Controller 创建测试?

c# - 停止调试器后如何启动清理方法?

javascript - 使用 sinon spy restore 或 reset 的正确方法是什么?

java - 如何使用 JUnit 对时间相关方法进行单元测试

javascript - Mongoose 不会从预先存在的数据库、node.js 中检索数据