如何确保嵌套的异步代码将使用Mocha正确测试?

时间:2012-08-06 22:15:53

标签: asynchronous express mocha

我正在与Mocha合作,我正在尝试测试我正在构建的API。

我无法理解done()功能的放置位置。

如果我将它放在现在的位置,它不会执行User.findOne()的回调函数。

如果我将完成放置在User.findOne()的回调函数的底部,则会创建超时。

我对async和这个完成功能相对较新,所以有人可以帮助解释为什么会发生这两种情况,以及如何修复代码以便它能在Mocha中正确测试?

describe('POST /signup', function() {
  before(checkServerIsRunning); // Need to implement
  it('create a new user if username is unique', function(done) {
    httpReq({
      method : 'POST',
      url    : url + '/signup',
      json   : true,
      body   : JSON.stringify({ 
        username : 'test',
        first    : 'first',
        last     : 'last' })
      },
      function (err, res, body) {
        if (err) {
          done(err);
        }
        else {
          res.statusCode.should.be.equal(201);
          User.findOne( { username: 'test' }, function(err, user) {
            user.should.have.property('username', 'testy');
            user.should.have.property('firstName', 'first');
            user.should.have.property('lastName', 'last');
            usersToRemove.push(user);
          });
          done();
        }
      }
    );
  });
});

1 个答案:

答案 0 :(得分:1)

您应将done()置于被叫findOne内。

如果你发现它超时,那么findOne永远不会调用它的回调(这是一个错误!)或执行时间太长。

在这种情况下,您可以通过在测试开始时粘贴this.timeout(5000)之类的内容来延长超时(将超时时间增加到5秒)。

一般情况下,你通常不会希望测试速度慢,所以也许可以尝试找出为什么需要这么长的时间。