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

时间:2015-03-05 17:55:25

标签: 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作为回调,则会收到错误,因为已多次调用done。

2 个答案:

答案 0 :(得分:1)

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

我认为它不应该使用或不使用回调,因为所有这些帖子都是异步调用。你解雇了其中的20个,然后马上做了一个。你有一个竞争条件,你很幸运,在你获得之前,帖子已经完成。 (使用空的回调函数,你赢得了这种竞争条件,没有你正在失去它。)

要修复竞争条件,您需要等待帖子完成才能获得分数。

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

这样做是一种讨厌的代码,你可能想要使用promises。我搜索了一下,显然有一个名为supertest-as-promised的npm模块。

答案 1 :(得分:0)

我想回答您的问题,假设您想在自己的功能中实际执行此操作,而不仅仅是您正在使用的.expect来电。< / p>

人们通常处理此问题的方法是检查是否将回调参数传递给函数,例如:

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

这也使您的应用程序在承诺和链接等方面更好地工作。

现在,在您的具体情况下,您可以完全省略回调,事情应该可以正常工作。