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 test
testing正在通过。
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.readdir
和fs.readdirSync
的输出在Linux(通常可能是POSIX系统) 上sorting, 而在Windows上却不是 。 此外,Linux上的sorting行为可能最终被删除,因为文档说fs.readdir
只是readdir(3)
,而后者不能保证顺序。 有一个很好的论点是,在Linux上观察到的行为是一个错误(请参阅上面链接到的问题)。
请注意,有一个 – --sort
选项,将sorting文件后,摩卡发现他们。 但是这是默认closures的。
您观察到的行为不仅可以通过加载订单而是通过执行订单来解释 。 这是发生了什么事情:
-
摩卡加载testing文件并执行它们。 因此,文件顶层的任何内容都会立即执行。 这意味着
test_helper.js
中的代码立即执行。 每次呼叫立即执行callback。 但是,调用it
loggingtesting以供稍后执行。 摩卡正在发现你的testing,而不是马上执行它们。 -
一旦所有的文件被执行,摩卡开始运行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