如何在没有setTimeout的情况下使用async mocha before()初始化?

时间:2015-04-11 15:17:09

标签: javascript unit-testing asynchronous mocking mocha

我正在使用Mocha来测试我创建的一些数据库查询。我需要在block之前创建适当的外键,以便单元测试可以专注于测试我的Node ORM的原始创建/删除功能。

我的问题是我在before块中插入数据库条目,并且在before块执行完毕之前单元测试正在运行。

I read that promises should be used to deal有这种事情,所以我重构了我的代码库以使用promises但我仍然无法解决我需要setTimeout这一事实。

如何执行异步before阻止而无需在it中包装我的第一个setTimeout块?

var chai = require('chai');
var expect = chai.expect;
var db = require('../server/db/config');
var models = require('../server/db/models');

describe('scoring', function() {

  var testMessage = {
    x: 37.783599,
    y: -122.408974,
    z: 69,
    message: 'Brooks was here'
  };

  var messageId = 1;

  before(function() {
    var token = '' + Math.random();
    models.createUser(token).then(function() {
      testMessage.userToken = token;
      models.insert(testMessage)
    });
  });

  it('should have votes created in db when createVote is called', function(done) {
    setTimeout(function(done) {
      models.createVote(messageId, token, function(err, res) {
        expect(res.insertId).to.be.a('number');
        done();
      });
    }.bind(this, done), 1000);
  });
});

1 个答案:

答案 0 :(得分:1)

与其他Mocha API方法一样,您传递给before的函数可以接受done回调。您应该在before操作完成后调用此方法:

before(function(done) {
  var token = '' + Math.random();
  models.createUser(token).then(function() {
    testMessage.userToken = token;
    return models.insert(testMessage)
  }).then(function() {
    done();
  })
});

Mocha docs - asynchronous code