before()在后续describe()之前没有执行?

时间:2014-03-19 19:17:13

标签: javascript node.js unit-testing mocha

给出以下代码:

var api = {};
var models = {};
describe(vars.project.name, function() {

  before(function(done) {

    // Loading models
    models_module.getDbInstance('0.1', function(res) {
      db = res;

      var config = {
        server: server,
        db: db,
        v: '0.1'
      };

      // Importing all the tests 
      api.base = require('./functions/api.base.js')(config);
      models.test_table = require('./functions/models.test_table.js')(config);

      done();
    });
  });


  // Tests general status
  describe('checking the status of the API without a version', function() {
    it('should succeed with 200 OK', api.base.status.without_route);
  });
});

这将使用我的0.1版本模型加载数据库,然后require我的测试定义,将数据库和其他一些配置信息传递给它。这是理论上的。

相反,我收到错误Cannot read property 'status' of undefined。这意味着它在完成before函数之前尝试执行我的测试,或者至少初始化它。

我还尝试了async.series(加载模型,然后加载测试)但它没有做任何事情,只显示0 passing (0ms)

这有什么问题?

1 个答案:

答案 0 :(得分:1)

我看到树,错过了森林......

这不起作用:

describe('checking the status of the API without a version', function() {
    it('should succeed with 200 OK', api.base.status.without_route);
});

问题在于,当Mocha 构建测试套件时,您正在尝试评估api.base。简而言之,您应该记住,传递给describe的回调在测试开始之前进行评估。在执行单个测试之前,不会评估传递给it调用的回调。 (请参阅我的另一个answer了解所发生情况的所有详细信息。)因此,在评估api.base.satus.without_route的阶段,api.base尚未设置。

describe('checking the status of the API without a version', function() {
    it('should succeed with 200 OK', function () {
        api.base.status.without_route();
    });
});

根据你在问题中的代码,我假设api.base.status.without_route是一个在你的条件不满足时会失败的函数。它是一个功能看起来很奇怪,但我不知道你的应用程序的更大的上下文。我的假设基于这样一个事实,即传递给it的第二个参数应该是一个回调。如果它不是函数,那么您需要编写所需的任何特定测试(if (api.base.status.without_route === ...) etc.