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

How to test multiple calls without empty callback

我有一个场景,我想在单个测试中对 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 调用将 return 的值递增 /score

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

如果我没有回调,得分 return 0,测试失败。如果我使用 done 作为回调,我会得到一个错误,因为 done 被多次调用。

假设您想在自己的 自己的 函数中实际执行此操作,而不仅仅是您正在使用的 .expect 调用,我将回答您的问题。

人们通常处理这个问题的方式是检查回调参数是否被传递到函数中,例如:

function add(input1, input2, cb) {
  var result = input1 + input2;

  if (cb) {
    cb(null, result); // since our callback exists, call it!
  } else {
    return result; // if not callback was given, just return the value
  }
});

这还可以使您的应用程序更好地处理诸如承诺和链接之类的事情。

现在,在您的具体情况下,您可以简单地完全省略回调,事情应该会正常进行。

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

我认为它不应该有或没有回调,因为所有这些 posts 都是异步调用。你发射了其中的 20 个并立即获得。你有一个竞争条件,你很幸运 posts 在你做之前就已经完成了。 (使用空回调函数,您将赢得此竞争条件,而没有您将失去它。)

要修复竞争条件,您需要等待 posts 完成后再获取分数。

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

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

的 npm 模块