javascript – Mocha如何知道在测试套件中首先加载哪个文件

前端之家收集整理的这篇文章主要介绍了javascript – Mocha如何知道在测试套件中首先加载哪个文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试用MongodB学习A测试驱动方法.文件夹结构

要在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在每个目录中递归加载文件,从根目录开始,因为这里的所有内容都只是一个目录所以它在这里没有任何区别.

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

解决方法

Mocha加载测试文件的方式没有默认的设置顺序.

当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()来启动套件.

猜你在找的JavaScript相关文章