1

我正在使用 Mocha 并正在尝试测试我正在构建的 API。

我无法理解该done()函数的放置位置。

如果我把它放在现在的位置,它不会执行User.findOne().

如果我将 done 放在回调函数的底部User.findOne(),那么它会创建一个超时。

我对 async 和这个 done 功能相对较新,所以有人可以帮助解释为什么会发生这两种情况,以及如何修复代码以便在 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();
        }
      }
    );
  });
});
4

1 回答 1

1

你应该放在done()被调用的 to 里面findOne

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

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

一般来说,您通常不希望测试那么慢,所以也许尝试找出为什么需要这么长时间。

于 2012-08-07T13:09:52.277 回答