before()在之后的describe()之前不执行?

给出以下代码:

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我的testing定义,传递数据库和一些其他configuration信息。 这是理论上的。

相反,我得到一个错误,说Cannot read property 'status' of undefined 。 这意味着它会在完成before函数之前尝试执行我的testing,或者至less初始化它。

我也试过用async.series (加载模型,然后加载testing),但它什么都不做,只显示0 passing (0ms)

这有什么问题?

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

这不能工作:

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

问题是,当Mocha 构buildtesting套件时,您正在尝试评估api.base 。 简而言之,您应该记住,在testing开始之前评估传递给describe的callback。 传递给调用的callback只有在执行单个testing之后才会被评估。 (请参阅我的另一个答案 ,了解当发生什么情况时的所有细节)。因此,在评估api.base的阶段, api.base.satus.without_route尚未设置。

 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是一个函数,如果你的条件不满足将失败。 这是一个function看起来很奇怪,但我不知道你的应用程序的大背景下。 我基于我的假设,第二个parameter passing给it应该是一个callback。 如果它不是一个函数,那么你将需要写任何你需要的特定testing( if (api.base.status.without_route === ...) etc.