要在src文件夹中测试的user.js
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测试时,测试正在通过.
Connected to Mongo! Creating records √ Saves a user (779ms)
但我怀疑Mocha是如何知道首先运行test_helper.js文件的. (同样将此文件命名为任何其他名称不会更改行为).
我也没有使用任何根级钩子.
解决方法
当Mocha scans a directory找到它的文件时,它使用fs.readdirSync
.这个调用是readdir(3)
左右的包装,它本身不保证顺序.现在,由于implementation quirk,fs.readdir和fs.readdirSync的输出在Linux(通常可能是POSIX系统)上排序,但在Windows上排序.此外,最终可能会删除Linux上的排序行为,因为文档说fs.readdir只是readdir(3)而后者不保证顺序.有一个很好的论据可以证明在Linux上观察到的行为是一个错误(请参阅我上面链接的问题).
请注意,有一个–sort选项可以在Mocha找到它们之后对文件进行排序.但默认情况下这是关闭的.
您观察到的行为不仅可以通过加载顺序而且可以通过执行顺序来解释.这是发生的事情:
> Mocha加载测试文件并执行它们.因此,文件顶层的任何内容都会立即执行.这意味着test_helper.js中的代码会立即执行.每次调用的调用都会立即执行其回调.但是,调用它会记录测试以便以后执行. Mocha在执行此操作时会发现您的测试,但不会立即执行它们.
>一旦执行完所有文件,Mocha就会开始运行测试.到目前为止,test_helper.js中的代码已经运行,并且您的测试会从它创建的连接中受益.
主要警告连接到数据库是一种异步操作,目前没有什么能保证test_helper.js中的异步操作在测试开始之前就已完成.它现在工作正常只是运气.
如果这是我,我要么在挂钩之前将连接创建放在全局异步中. (在任何测试文件中出现的全局挂钩将在任何测试之前执行,甚至是在其他文件中出现的测试.)或者我use --delay
并且在保证建立连接后显式调用run()来启动套件.