2012-08-06 61 views
1

我与摩卡的工作,我试图测试,我在建设过程中的API。如何确保嵌套的异步代码可以使用Mocha正确测试?

我无法理解在哪里放置done()功能。

如果我把它放在哪里,现在,它不执行的User.findOne()回调函数。

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

我是比较新的异步和该做的功能,所以有人可以帮助解释为什么这两种情况发生,以及如何解决的代码,以便它会在摩卡正确测试?

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

您应该将done()里面叫findOne

如果您发现超时,那么任何一个findOne都不会调用其回调函数(这是一个错误!)或执行时间太长。

在这种情况下,你可能增长在测试(这增加了超时时间为5秒)开始坚持像this.timeout(5000)超时。

一般来说,你通常不会想要测试,虽然慢,所以也许尝试找出为何需要这么长时间。

+0

谢谢,我发现我没有连接到我的数据库(我傻!)这就是为什么它被超时。它应该进入findOne! – ArKi 2012-08-07 16:16:05

相关问题