Mocha如何知道在testing套件中首先加载哪个文件

我正试图用MongodB学习一个testing驱动的方法。 文件夹结构

在这里输入图像描述

一个user.js在src文件夹中testing

 const mongoose = require('mongoose'); mongoose.Promise = require('bluebird'); const Schema = mongoose.Schema; const UserSchema = new Schema ({ name: String }); const User = mongoose.model('user', UserSchema); module.exports = User; 

test_helper.js内容

 const mongoose = require('mongoose');; mongoose.connect('mongodb://localhost/users_test'); mongoose.connection .once('open', () => { console.log('Connected to Mongo!'); done()}) .on('error', (error) => { console.warn('Warning', error); }); 

create_test.js内容

 const assert = require('assert'); const User = require('../src/user'); describe('Creating records', () => { it('Saves a user', (done) => { const user = new User({ name: 'Ankur' }); user.save() .then(() => { assert(!user.isNew); done(); }); 

现在,当我运行npm testtesting正在通过。

 Connected to Mongo! Creating records √ Saves a user (779ms) 

但是我的疑问是, Mocha如何知道每次运行test_helper.js文件。 (也将该文件命名为任何其他名称不会改变行为)。

另外我不使用任何根级别的钩子。

我知道摩卡在每个目录recursion地加载文件,从根目录开始,因为这里的一切都只有一个目录,所以在这里没有任何区别。

有人可以build议或帮助,摩卡如何确切知道test_helper.js (或具有相同内容的任何文件名)应该先运行。

对于Mocha如何加载testing文件,没有默认的设置顺序。

当Mocha 扫描目录来查找文件时,它使用fs.readdirSync 。 这个调用是readdir(3)一个包装,它本身不保证顺序。 现在,由于执行的怪癖 , fs.readdirfs.readdirSync的输出在Linux(通常可能是POSIX系统) sorting, 而在Windows上却不是 。 此外,Linux上的sorting行为可能最终被删除,因为文档说fs.readdir只是readdir(3) ,而后者不能保证顺序。 有一个很好的论点是,在Linux上观察到的行为是一个错误(请参阅上面链接到的问题)。

请注意,有一个 – --sort选项,将sorting文件后,摩卡发现他们。 但是这是默认closures的。

您观察到的行为不仅可以通过加载订单而是通过执行订单来解释 。 这是发生了什么事情:

  1. 摩卡加载testing文件并执行它们。 因此,文件顶层的任何内容都会立即执行。 这意味着test_helper.js中的代码立即执行。 每次呼叫立即执行callback。 但是,调用itloggingtesting以供稍后执行。 摩卡正在发现你的testing,而不是马上执行它们。

  2. 一旦所有的文件被执行,摩卡开始运行testing。 到目前为止, test_helper.js的代码已经运行,您的testing将从它创build的连接中受益。

主要警告连接到数据库是一个asynchronous操作,目前没有什么能保证test_helper.js中的asynchronous操作在testing开始之前就已经完成了。 它现在正常运行只是运气。

如果这是我,我会把连接创build在钩子before的全局asynchronous。 (出现在任何testing文件中的全局钩子将在任何testing之前执行, 即使是在其他文件中出现的testing或者,我会使用--delay并显式调用run()来启动套件被制造。

它不

testing不应有特定的顺序。 所有的testing套件应该作为独立于其他套件的独立工作。 在套件内部,您可以使用“之前”和“之前”(或“之后”,“之后”)来创build设置和拆卸步骤。

但是,如果testing的顺序很重要,那么devise中会有一些东西被打破。

有一个非常简单的方法来顺序加载testing。

第1步:在package.json中设置一个testing脚本:例如

 "scripts": { "test": "mocha ./tests.js" } 

让我们假设tests.js是一个文件,它定义了执行testing的顺序。

 require("./test/general/test_login.js"); require("./test/Company/addCompany.js"); ... ... 

所以这里test_login会先运行,然后一个一个运行。

第2步:然后运行testing:

 $ npm test