javascript - 如何在没有空回调的情况下测试多个调用

标签 javascript node.js express supertest

我有一个场景,我想在单个测试中对 Express 提供的 Node.js 服务进行多个 REST 调用,即:

var request = require('supertest'),
should = require('should'),
game = require('../game.js').app;

describe('single pin game of bowling', function(done) {
    it('should return 20', function(done) {
        for(var i = 0; i < 20; i++) {
            request(game).post('/bowl/1').expect(200, function(){});
        }
        request(game).get('/score').expect('20', done);
    });
});

在此阶段,POST 调用会递增 /score 返回的值。

当这个测试通过时,有没有办法消除 POST 期望中的空回调函数?

如果我没有回调,则得分返回 0 并且测试失败。如果我使用 done 作为回调,则会收到错误,因为 did 被多次调用。

最佳答案

你说它的工作原理如图所示,但是当你删除空回调时它会失败。

我认为无论有没有回调它都不应该工作,因为所有这些帖子都是异步调用。你发射了 20 个,然后立即进行攻击。你有一个竞争条件,你很幸运,帖子在你获取之前就已经完成了。 (使用空回调函数,您将赢得此竞争条件,而如果没有,您将失去它。)

要解决竞争条件,您需要等待帖子完成才能获取分数。

当 post(或 get)请求完成时,回调函数将被调用。因此,直接的方法是触发第一个帖子,然后在其回调中触发下一个帖子,或者如果它是最后一次触发 get 请求。

这样做是一种令人讨厌的代码,您可能想使用 Promise 来代替。我搜索了一下,显然有一个名为 supertest-as-promised 的 npm 模块.

关于javascript - 如何在没有空回调的情况下测试多个调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28884503/

相关文章:

javascript - 如何只刷新网页上的饼图?

javascript - Node.js - 我将如何转发 HTTP 流量(反向代理)?

javascript - Jade 页面被多次渲染

node.js - 使用虚拟数据库在自己的环境中测试express.js应用程序

javascript - 导出默认路由; NodeJS 中的语法错误

javascript - 闭包编译器高级优化防止对象属性重命名

node.js - 加载共享库时出错 : libicui18n. so.68

javascript - 从 firebase 中出现的幽灵角色

javascript - 如何在 express、couchDB 和 node.js 中使用 session

javascript - 比较三种插入 dom 元素的方式 + 使用 jQuery Mobile 增强它们