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

时间:2017-04-05 10:59:06

标签: javascript node.js mongodb testing mocha

我试图用MongodB学习A测试驱动方法。文件夹结构

enter image description here

要在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 test时,测试结束了。

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

但我怀疑的是Mocha如何知道每次运行test_helper.js文件。 (同样将此文件命名为任何其他名称并不会改变行为)。

我也没有使用任何根级别的钩子。

我知道mocha在每个目录中递归加载文件,从根目录开始,因为这里的所有内容都只是一个目录,所以这里没有任何区别。

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

3 个答案:

答案 0 :(得分:9)

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

当Mocha scans a directory找到文件时,它会使用fs.readdirSync。此调用是readdir(3)的包装,它本身并不保证顺序。现在,由于implementation quirkfs.readdirfs.readdirSync的输出在Linux(通常可能是POSIX系统)上排序,但不在Windows上。此外,最终可能会删除Linux上的排序行为,因为文档说fs.readdir只是readdir(3)而后者不保证顺序。有一个很好的论据可以证明在Linux上观察到的行为是一个错误(请参阅我上面链接的问题)。

请注意,有一个--sort选项可在Mocha找到它们之后对文件进行排序。但默认情况下这是关闭的。

您观察到的行为不仅可以通过加载订单而且可以通过执行顺序来解释。以下是发生的事情:

  1. Mocha加载测试文件并执行它们。因此,位于文件顶层的任何内容都会立即执行 。这意味着test_helper.js中的代码会立即执行。每次调用describe都会立即执行其回调。 然而,调用it会记录测试以供以后执行。 Mocha在执行此操作时发现您的测试但不正确执行程。

  2. 执行完所有文件后,Mocha开始运行测试。到目前为止,test_helper.js中的代码已经运行,您的测试会从它创建的连接中受益。

  3. 重大警告连接数据库是一种异步操作,目前没有什么可以保证test_helper.js中的异步操作在测试开始之前就已完成。它现在工作正常只是运气。

    如果这是我,我要么将连接创建放在全局异步before挂钩中。 (任何测试文件中出现的全局 before挂钩都将在任何测试之前执行,甚至是出现在其他文件中的测试。)或者我{ {3}}并明确调用run()以在保证建立连接后启动套件。

答案 1 :(得分:1)

它没有

测试不应该有特定的顺序。 所有测试套件应与其他套件独立无关。在套件内部,您可以使用“before”和“beforeEach”(或“after”,“afterEach”)来创建设置和拆卸步骤。

但如果测试的顺序很重要,那么设计中就会出现问题。

答案 2 :(得分:0)

有一种非常简单的方法可以按顺序加载测试。

步骤1:在package.json中设置测试脚本: 例如

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

让我们假设tests.js是一个定义执行测试的顺序的文件。

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

所以这里test_login将首先运行,然后逐个运行。

步骤2:然后使用以下命令运行测试

$ npm test