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

How to test multiple calls without empty callback

本文关键字:测试 情况下 调用 回调      更新时间:2023-09-26

我有一个场景,我想在一个测试中对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作为回调,我会得到一个错误,因为done被调用了多次。

您说它如图所示工作,但当您删除空回调时,它失败了。

我认为无论有没有回调,它都不应该工作,因为所有这些帖子都是异步调用。你发射了20个,然后立即发射。你有一个比赛条件,你很幸运,帖子在你获得之前就已经完成了。(有了空回调函数,你就赢得了这场比赛,而没有你就失去了它。)

为了解决比赛条件,你需要等待帖子完成后再进行得分。

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

这样做是一种令人讨厌的代码,您可能需要使用promise。我搜索了一下,显然有一个名为supertest的npm模块。

我将回答您的问题,假设您想在自己的函数中实际执行此操作,而不仅仅是使用的.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
  }
});

这也使您的应用程序能够更好地处理诸如promise和chaining之类的事情。

现在,在您的特定情况下,您可以简单地完全省略回调,一切都应该正常。